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



我的程序有两个线程和一个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
}

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

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

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

最新更新