Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 变量和多线程的奇怪问题_C_Multithreading_Loops_If Statement - Fatal编程技术网

C 变量和多线程的奇怪问题

C 变量和多线程的奇怪问题,c,multithreading,loops,if-statement,C,Multithreading,Loops,If Statement,我有一个多线程的程序。 在我的主线程中,我在一个永久循环中检查全局变量的值是否为1。 这个变量是我在运行时在另一个线程中设置的,其中一个互斥锁被锁定为1。 因此,if条件在主线程中应该为true。但它不起作用。。。但是如果我在if条件之前加上printf,它就会工作。这太奇怪了,我不知道怎么了。谢谢 守则: while(1) { printf("\n"); if(logging_active == 1) { //check filesize every 30s.

我有一个多线程的程序。 在我的主线程中,我在一个永久循环中检查全局变量的值是否为1。 这个变量是我在运行时在另一个线程中设置的,其中一个互斥锁被锁定为1。 因此,if条件在主线程中应该为true。但它不起作用。。。但是如果我在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\u-active
更改为
volatile int-logging\u-active
解决了问题。

编译器不知道您正在从另一个线程更新变量,因此它可能不会每次都检查它。将变量标记为volatile,它应该可以正常工作。这告诉编译器,不允许忽略该变量中的加载—它每次都必须读取该变量。

我假设您正在锁定互斥锁并更新其他线程中活动的日志记录。您应该锁定相同的互斥锁,并在当前线程中执行签入

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

但我建议您使用。

显示您的代码。是的,对不起,我忘了。我编辑它。我在阅读代码中没有看到互斥。。。如果不在访问受保护资源/变量的所有位置使用互斥锁,互斥锁就不会真正起作用。我假设logging\u active是您的变量。但是互斥锁在哪里呢?@StoryTeller它要求写操作也是原子的,这是绝对不能保证的。(例如,写入可能由3个按顺序执行的逐位操作组成,如果没有互斥锁,则可以在其中2个操作产生糟糕的值后进行读取。)好的,如果变量是非静态全局变量(在多个不同的源文件中使用时,它几乎必须是非静态全局变量),那么
volatile
与否,编译器不会优化它。@barakmanos:编译器不会优化变量,但它可能会优化重复加载(如果它没有“看到”中间存储)。@usr,您引用的句子暗示可能会发生这种情况。编译器无法优化函数调用后的读取,因为调用可能有副作用。@usr,当然这取决于它的功能。编译器无法知道,因此它不会假设。不同的供应商提供不同的标准库实现,有时甚至没有源代码。如果函数定义不存在,语法分析如何得出没有副作用的结论!?这很难解决!我们不是“假设某种错误的说法”,我们只是理解在多线程环境中优化是如何出错的,因为编译器不是无所不知的。@JohnZwinck写操作可能由3个按顺序执行的位操作组成,如果没有互斥锁,读操作可以在其中两个操作产生一个糟糕的值后完成。当然,用一个单独的操作(在另一个变量中执行中间步骤)来替换它是很容易的,但是您要求提供一个示例。。。