gpt4 book ai didi

c - 多线程编程使用全局变量时出现的奇怪问题

转载 作者:太空宇宙 更新时间:2023-11-04 10:12:09 25 4
gpt4 key购买 nike

有点奇怪,我的场景如下:

在文件A.c中定义两个全局变量:

volatile bool g_test = true;
pthread_mutex_t g_test_mutex = PTHREAD_MUTEX_INITIALIZER;

在文件 A.c 中,全局变量是只读的。

...
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);
...

并且全局变量写在另一个文件B.c中

...
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");
...

以上代码都OK

但是奇怪的是,去掉最后一句printf,g_test改变后就无法同步成功,文件A.c无法获取到更新后的值,为什么??

更新:

我更改代码:

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);

通过了,但是这样每次都会锁住mutex,使用这种方法会增加多少开销?

最佳答案

B.c 不应该在没有持有 g_test_mutex 的情况下引用 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() 中使用该局部。

当并发程序通过改变通信区域之外的时间来改变行为时,寻找竞争条件。

关于c - 多线程编程使用全局变量时出现的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48414672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com