分离线的种族条件
Race Condition in detached Thread
我试图找到一个类似的问题,但找不到它,或者我的知识不足以识别相似性。
我有一个主循环创建一个对象,而该对象具有无限循环来处理矩阵并使用此矩阵进行操作。我在单独的线程中调用此过程函数,因此它能够多次处理矩阵,而主循环可能只是等待某件事而无能为力。
一段时间后,主循环收到了一个新矩阵,而我仅通过创建一个新矩阵并将此新矩阵传递到对象中来表示。这个想法是,由于等待了几秒钟,然后在无限的情况下进行处理,而再次循环可以锁定互惠件,而mutex并未(几乎)经常锁定。
下面我尝试编码一个最小示例。
class Test
{
public:
Test();
~Test();
void process(){
while(1){
boost::mutes::scoped_lock locker(mtx);
std::cout << "A" << std::endl;
// do stuff with Matrix
std::cout << "B" << std::endl;
mtx.unlock();
//wait for few microseconds
}
}
void updateMatrix(matrix MatrixNew){
boost::mutes::scoped_lock locker(mtx);
std::cout << "1" << std::endl;
Matrix = MatrixNew;
std::cout << "2" << std::endl;
}
private:
boost::mutex mtx;
matrix Matrix;
}
int main(){
Test test;
boost::thread thread_;
thread_ = boost::thread(&Test::process,boost::ref(test));
thread_.detach();
while(once_in_a_while){
Matrix MatrixNew;
test.updateMatrix(MatrixNew);
}
}
不幸的是发生了种族条件。流程和更新在锁定的静音环境中具有多个步骤,而我将这些步骤打印到这些步骤之间的控制台。我发现,这两个矩阵都被弄乱了,字母/数字平行而不是连续发生。
有什么想法为什么会发生?
最好的祝愿,预先感谢
while(1){
boost::mutes::scoped_lock locker(mtx);
std::cout << "A" << std::endl;
// do stuff with Matrix
std::cout << "B" << std::endl;
mtx.unlock();
//wait for few microseconds
}
在这里您手动解锁mtx
。然后以后的某个时候scoped_lock
(称为locker
) 也将静音器解锁在其破坏者中(这是该类别的重点)。我不知道保证的boost::mutex
需要什么,但解锁的次数超过锁定的次数,这不会导致任何好处。
而不是 mtx.unlock();
您可能想要locker.unlock();
编辑:这里的建议是避免为此使用Boost并改用标准C 。自C 11(8年!)以来,thread
ING一直是标准的一部分,因此大概您的所有工具现在都会支持它。使用标准化的代码/工具可以为您提供更好的文档和更好的帮助,因为它们众所周知。我不是在敲打boost(大量标准始于Boost),但是一旦将某些东西纳入标准,您应该强烈考虑使用它。
相关文章:
- QWebEngine 5.7.1 离线导航加载缓存
- ActiveMq:持久队列和离线系统
- 如何离线安装熊猫和依赖项
- QT离线安装程序和兼容的C 编译器安装
- 'tedt'的离线定义
- 离线 Qt 文档
- 如何在QML(Qt)中离线运行OpenStreetMap
- CMAKE:外部项目更新和离线工作
- 如何在没有相机的情况下使用 Kinect 捕获的 RGB-D(请离线流示例代码)
- 缓存Google Maps供离线使用
- 离线嵌入式实时路由
- 可以使用缓存使QML应用程序“离线支持”
- 竞争条件:一个线程创建静态对象,另一个线程在初始化完成之前使用它.如何处理
- "= default"是否允许离线实施?
- c++ -为离线VS2013加载微软符号
- Postgresql服务器和客户端离线模式
- 离线虚拟方法
- 如何创建离线数据库与c++一起使用
- 如何得到一个距离矩阵的计算正在离线上我的服务器
- 基于订阅的软件许可-离线验证