全局变量在c中的其他线程中不会改变

时间:2014-03-18 02:21:52

标签: c linux global-variables

我在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;;
}

1 个答案:

答案 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;
}