繁体   English   中英

使用全局变量时有关多线程编程的奇怪问题

[英]Strange problems about multi-thread programming when using global variable

有点奇怪,我的情况如下:

在文件Ac中定义两个全局变量:

volatile bool g_test = true;
pthread_mutex_t g_test_mutex = PTHREAD_MUTEX_INITIALIZER;

在文件Ac中,全局变量是只读的。

...
pthread_mutex_lock(& g_test_mutex); 
if(! g_test){
     ret = -1;
     pthread_mutex_unlock(& g_test_mutex);
     goto cleanup;
 }
pthread_mutex_unlock(& g_test_mutex);
...

并将全局变量写入另一个文件Bc

...
extern volatile bool g_test;
extern pthread_mutex_t g_test_mutex;

bool tmpval = func_to_getval();

if(tmpval != g_test){
   pthread_mutex_lock(& g_test_mutex);
   g_test = tmpval;
   pthread_mutex_unlock(&g_test_mutex);
}
printf("g_test value:%s\n",g_test?"yes":"no");
...

上面的代码都可以。

但是很奇怪,删除最后一个printf语句时,更改g_test且文件Ac无法获得更新的值时,该值无法成功同步。

更新:

我更改代码:

bool tmpval = func_to_getval();

if(tmpval != g_test){
   pthread_mutex_lock(& g_test_mutex);
   g_test = tmpval;
   pthread_mutex_unlock(&g_test_mutex);
}
printf("g_test value:%s\n",g_test?"yes":"no");

pthread_mutex_lock(&g_can_encrypted_mutex);
g_can_decrypted = func_to_getval(env); 
pthread_mutex_unlock(&g_can_encrypted_mutex);

它通过了,但是这每次都会锁定互斥锁,使用此方法会增加多少成本?

不持有g_test_mutex,Bc不应引用g_test; 两个线程可以争夺该代码,并且因为您在if中阅读g_test,然后又对其进行了更新,所以可能有另一个线程同时进入并更新了g_test。

这意味着此原始代码是错误的:

if(tmpval != g_test){  // Access to g_test without mutex
   pthread_mutex_lock(& g_test_mutex);
   g_test = tmpval;
   pthread_mutex_unlock(&g_test_mutex);
}

您应该将g_test的副本保存在您持有锁时分配的局部变量中; 然后释放锁定后,在printf()中使用该本地变量。

当并发程序通过更改通信区域外部的时间来更改行为时,请查找竞争条件。

您的程序在printf调用之后会很快结束吗? 是通过显示为Bc的代码在main的末尾附近,还是通过在printf之后调用exit或类似代码? 如果是这样,您的程序很可能在Ac中的代码开始运行之前就终止了,并且对printf的调用只是简单地将退出延迟了足够长的时间,使其有时间运行。 如果是这种情况,则需要添加一些退出同步-例如,对pthread_join的调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM