[英]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.