Multithreading 从一个线程读取全局变量并从另一个线程写入该变量

Multithreading 从一个线程读取全局变量并从另一个线程写入该变量,multithreading,thread-safety,mutex,Multithreading,Thread Safety,Mutex,我的程序有两个线程和一个int全局变量。一个线程正在读取该变量,另一个线程正在写入该变量。在这种情况下我应该使用互斥锁吗 在我的程序中,这些函数从两个线程同时重复执行 void thread1() { if ( condition1 ) iVariable = 1; else if ( condition2 ) iVariable = 2; } void thread2() { if ( iVariable == 1) /

我的程序有两个线程和一个int全局变量。一个线程正在读取该变量,另一个线程正在写入该变量。在这种情况下我应该使用互斥锁吗

在我的程序中,这些函数从两个线程同时重复执行

void thread1()
{
    if ( condition1 )
        iVariable = 1;
    else if ( condition2 )
        iVariable = 2;
}

void thread2()
{
    if ( iVariable == 1)
        //do something
    else if ( iVarable == 2 )
        //do another thing

}

是的,你应该(在大多数情况下)。互斥锁将确保您所保护的数据在多个争用CPU中正确可见。除非有性能问题,否则应该使用互斥锁。如果性能是一个问题,请查看无锁数据结构。

如果不使用任何同步,那么当第二个线程看到更新的值时,它是完全不可预测的。这个范围在几纳秒到从不之间。当然,由于never结果特别麻烦,当您不声明volatile变量并运行程序的发布版本时,它可能会发生在x86处理器上。在内存较弱的处理器(如ARM内核)上,这可能需要很长时间。您唯一不必担心的是看到部分更新的值,int更新是原子的


这就是关于发布代码的所有内容。细粒度锁定很少能很好地工作。

如果iVariable周围没有互斥锁,很可能不是多核/CPU系统中的所有CPU都会在您认为应该的时候看到更新。其中一些内存可见性竞争条件可能高度依赖于机器。所以,使用互斥锁、自旋锁或原子变量。比如说,thread1()将把1赋值给iVariable(比如,iVariable的旧值为0),同时thread2()函数计算if条件中的(iVariable==1)表达式。我知道(iVariable==1)表达式返回的布尔值是不可预测的。但是我想知道在执行thread1()函数之后,iVariable1的值是1还是其他一些垃圾值。这是我在回答中提到的“你唯一不必担心的事情”。那么就没有什么可担心的了。没有必要使用互斥锁,因为没有垃圾值会被分配给ivvariable。你似乎没有认真对待我答案中的never子句。这不可避免地需要通过艰苦的方式来学习。我没有理解。你所说的“从不”是指它不会被更新,尽管它应该被更新。我说得对吗?