我有一个包含多个线程的程序。 在我的主线程中,我在永久循环中检查全局变量的值是否为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
解决了问题。
答案 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
,它应该按预期工作。这告诉编译器不允许从该变量中省略加载 - 它必须每次都读取它。