c++中同步时为空
empty while synchronization in c++?
static char szInfo[256];
static volatile bool bIsLocked = false;
static void ApiFunc() {
while (bIsLocked) { }
bIsLocked = true;
//do something to szInfo
bIsLocked = false;
}
自从我在c++中做过任何线程以来,已经有一段时间了,这是否足够安全?这对我来说是一个比使用互斥锁简单得多的解决方案,但是为什么我要使用windows互斥锁呢?
您可以使用互斥锁(或者更可能是临界区),因为这样可以工作。此代码不同步。可以有多个线程进入临界区
当然,真正的锁是不会旋转的。自旋锁确实可以,但是在选择使用自旋锁之前,您需要深入了解其性能含义。
这根本不是线程安全的!
线程#1通过检查,但没有设置布尔值。线程#2此时出现在关键会话中。
你所实现的几乎就是彼得森算法。正如上面的海报所说,这不是线程安全的,因为没有机制来防止两个线程同时进入临界区。您可以尝试正确地实现Peterson算法,但使用真正的互斥锁会有效得多。
您的方法的主要问题是线程可以在退出while循环之后被中断,但在它们将bool设置为true之前。如果发生这种情况,则两个线程一起进入临界区。如果你有两个以上的线程,那么将有多个线程同时退出循环。
这一点都不安全。volatile
在线程方面没有定义语义。至多,它将阻止编译器完全抑制赋值(因为它们的净效果是无操作),但它不会阻止编译器在访问bIsLocked
时重新排序对szInfo
的访问,并且它不会阻止硬件进行任何重新排序,甚至完全抑制bIsLocked = true
。
这段代码不会像您希望的那样工作。在while循环结束和将locked设置为true之间有一个竞争条件。当同步原语能够在等待期间释放CPU时,它还会导致CPU繁忙等待。
解决这个问题的一个更好的方法是使用本地数据而不是全局缓冲区。那么你可能根本不需要锁!如果您确实需要同步线程,请使用互斥锁或临界区,因为它们实际上可以工作。
使用锁
关于没有锁的线程的危险,来自BoostCon 2010:http://blip.tv/file/4211197/
幻灯片,注释,at:http://boostcon.boost.org/2010-resources
- 松弛原子与无同步情况下的记忆连贯性
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 如何在qt中同步应用程序和显示器的刷新率?
- Windows 进程间同步类似事件?
- 当对套接字 send() 的同步调用由于连接另一端丢失而被阻止时,如何恢复?
- 将 10 个线程与原子布尔值同步
- ofstream::close() 是否在 Linux 上调用同步?
- 与Visual Studios(c ++)同步时如何组织github存储库?
- 原子获取是否与互斥锁释放同步?
- Boost (Beast) websocket:同步写入挂起
- Postgres vs MySQL:命令不同步;.
- 线程过程中的线程同步问题
- 同步读取多个 TCP 响应
- 同步两个具有不同帧速率的传感器
- 如何定期同步线程?
- 同步对多个向量进行排序
- 同步类中的公共变量
- 如何检查 ntpd 是否仍在运行和同步