空的,而在C ++中同步?

static char szInfo[256]; static volatile bool bIsLocked = false; static void ApiFunc() { while (bIsLocked) { } bIsLocked = true; //do something to szInfo bIsLocked = false; }

它已经一段时间,因为我已经做了在C ++中的任何线程,这是足够安全? 这是一个更简单的解决方案,我比使用互斥体,但为什么我会用互斥的窗户代替?

--------------解决方案-------------

你可以使用一个互斥(或更可能的一个关键部分),因为这会工作。 此代码不同步。 多个线程可以进入临界区。

当然,真正的锁不旋转。 那么,自旋锁的事,但你需要一个自旋锁的性能影响的深刻理解选择使用人之前。

它不是在所有的线程安全的!

线#1变低谷检查,但不设置布尔值。 线#2来在这个时间在临界会话。

你已经实现了几乎是彼得森的算法。 如上海报说这不是线程安全的,因为没有机制防止进入的同时临界区两个线程。 您可以尝试适当地实现彼得森的算法,但它会更有效地使用真正的互斥。

你的方法的主要问题是,一个线程可以退出while循环后,他们设置了布尔为true之前被中断,但。 如果出现这种情况那么你的两个线程同时进入临界区。 如果有两个以上的线程那么你有多个线程在同一时间退出循环。

这不是安全的。 volatile已经没有与问候线程定义语义。 至多,它会阻止编译器完全抑制任务(因为他们的净效应是一个无操作),但它不会阻止编译器重新排序访问szInfo各地访问bIsLocked ,也不会防止硬件任何重新安排什么那么,甚至抑制bIsLocked = true完全。

此代码将无法工作,你希望它的方式。 有while循环的结束和你设置锁定为true时之间的竞争条件。 它还CPU忙等待锁,而同步primatives能够产生CPU在等待。

一个更好的办法来解决这个问题就是要使用本地数据,而不是一个全球性的缓冲区。 那么你可能甚至不需要在所有的锁! 如果你实际上需要同步线程,使用互斥或​​关键部分,因为这些将实际工作。

使用锁。

在没有锁的线程的危险谈,从2010年BoostCon:http://blip.tv/file/4211197/

幻灯片,备注,网址为:http://boostcon.boost.org/2010-resources

分类:C# 时间:2015-03-14 人气:0
本文关键词: 多线程,同步
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.155 (s). 10 q(s)