我在c程序中有一个全局变量,我的环境是Linux。 当我在主线程中更改我的全局变量时,我看到变化是正确的,但在其他线程中没有任何变化。 我的全局声明在.h文件中,.c是相同的文件名。 但是,如果我在另一个线程中更改全局,其他线程将更改。 我打印了全局var的内存,在主线程和其他线程中都是一样的。 下面是我的代码示例。
int pause_flag;
int initThread() {
int err;
err = pthread_create(&user_request_thread, NULL, (void *)&user_request_handler, NULL);
if (err != 0)
return(EXIT_FAILURE);
printLog("Agent-Less service", "start...");
closelog();
pthread_join(user_request_thread, NULL);
pthread_detach(user_request_thread);
return(EXIT_SUCCESS);
}
int pause() {
setPauseFlag(1);
return EXIT_SUCCESS;
}
void user_request_handler(void *arg) {
while (1) {
printf("pause_flag %d\n", getPauseFlag());
sleep(5);
}
pthread_exit(0);
}
void setPauseFlag(int value) {
pthread_mutex_lock(&pause_lock);
pause_flag = value;
pthread_mutex_unlock(&pause_lock);
}
int getPauseFlag() {
int temp;
pthread_mutex_lock(&pause_lock);
temp = pause_flag;
pthread_mutex_unlock(&pause_lock);
return temp;;
}
答案 0 :(得分:3)
在多核系统上,即使volatile
也不足以保证线程之间的同步。 volatile
将强制写入底层硬件,这可能是某些外围芯片中的硬件寄存器,或者只是DRAM中的一个位置。但是,如果其他核心具有变量的缓存副本,则它不一定会更新不同处理器核心上的变量。换句话说,volatile
不会强制跨多个处理器核心的高速缓存一致性。
要强制更新所有内核中所有线程都可见的变量,您需要使用内核的同步机制之一,例如:信号量。
http://en.wikipedia.org/wiki/Memory_barrier
另请参阅评论中pat提供的链接。
get
函数的代码应如下所示
int getPauseFlag()
{
int temp;
pthread_mutex_lock(&pause_lock);
temp = pause_flag;
pthread_mutex_unlock(&pause_lock);
return temp;
}