变量和多线程的奇怪问题

时间:2016-11-22 12:21:57

标签: c multithreading loops if-statement

我有一个包含多个线程的程序。 在我的主线程中,我在永久循环中检查全局变量的值是否为1。 我在运行时在另一个线程中设置的变量,其中Mutex锁定为1。 因此if条件应该在主线程中为真。但它不起作用......但如果我在if条件之前放置一个printf就可以了。这太奇怪了我不知道什么是错的。感谢

代码:

while(1) 
{
    printf("\n");
    if(logging_active == 1) {
        //check filesize every 30s. If logfile size over 1MB (1.000.000) send file
        if((timestamp_realtime_sec() - last_time) >= ((logtime+1))) {
            printf("check filesize...\n");
            if(fileSize("log") > 100000) {
                logfileHandler("log");
            }
            last_time = timestamp_realtime_sec();
        }
    }
}    

输出:

check filesize ...

没有printf,它什么都没输出。

我的解决方案: 将变量声明从int logging_active更改为volatile int logging_active解决了问题。

2 个答案:

答案 0 :(得分:1)

我假设您正在锁定互斥锁并在其他线程中更新logging_active。您应该锁定相同的互斥锁并在当前线程中进行检查。

pthread_mutex_lock(mutex);
while(logging_active == 0) {
        pthread_mutex_unlock(mutex)
        sleep(SOME_TIME);
    }
    pthread_mutex_unlock(mutex)
    //Your code
}

但我建议您使用condition variables

答案 1 :(得分:0)

编译器不知道您是否正在从另一个线程更新变量,因此每次都可能无法实际检查它。将变量标记为volatile,它应该按预期工作。这告诉编译器不允许从该变量中省略加载 - 它必须每次都读取它。