if块的同步,c++
Synchronization of if blocks, C++
我正在进行的项目使用了临界区的自定义实现。我创建临界区的方法如下:
{
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(...)
。
相关文章:
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 如何在qt中同步应用程序和显示器的刷新率?
- Windows 进程间同步类似事件?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 将 10 个线程与原子布尔值同步
- ofstream::close() 是否在 Linux 上调用同步?
- 与Visual Studios(c ++)同步时如何组织github存储库?
- 原子获取是否与互斥锁释放同步?
- Boost (Beast) websocket:同步写入挂起
- Postgres vs MySQL:命令不同步;.
- 线程过程中的线程同步问题
- 同步读取多个 TCP 响应
- 同步两个具有不同帧速率的传感器
- 如何定期同步线程?
- 同步对多个向量进行排序
- 同步类中的公共变量
- 如何检查 ntpd 是否仍在运行和同步