if块的同步,c++

Synchronization of if blocks, C++

本文关键字:c++ 同步 if      更新时间:2023-10-16

我正在进行的项目使用了临界区的自定义实现。我创建临界区的方法如下:

{
CriticalSectionLock lock(m_criticalsection);
...//Stuff inside the critical section
}

CriticalSectionLock超出作用域时,临界区结束。

我的问题是,我想把增量操作下面的临界区(我不能使用atomic_int):

if (0 == g_envCount++)
        {...

我想做如下的事情:

{CriticalSectionLock lock(m_criticalsection);
if (0 == g_envCount++)
}
        {

但我认为即使这有效,也会让读者感到困惑。有人能建议一个更好/更干净的方法吗?

由于您只需要在CriticalSection内增加增量,因此使用提升。

int priorEnvCount;
{
    CriticalSectionLock lock(m_criticalsection);
    priorEnvCount = g_envCount++;
}
if (0 == priorEnvCount) {
    ...
}

使用std::atomic<int>代替临界区。代码看起来像这样:

std::atomic<int> g_envCount;
...
// atomically post increment g_envCount and return its current value
if (0 == g_envCount++) {
    // do something
}

使用后增量操作符,您将自动使用顺序一致性内存排序。如果希望改进内存排序约束,可以使用fetch_add(...)