分离线的种族条件

Race Condition in detached Thread

本文关键字:条件 离线      更新时间:2023-10-16

我试图找到一个类似的问题,但找不到它,或者我的知识不足以识别相似性。

我有一个主循环创建一个对象,而该对象具有无限循环来处理矩阵并使用此矩阵进行操作。我在单独的线程中调用此过程函数,因此它能够多次处理矩阵,而主循环可能只是等待某件事而无能为力。

一段时间后,主循环收到了一个新矩阵,而我仅通过创建一个新矩阵并将此新矩阵传递到对象中来表示。这个想法是,由于等待了几秒钟,然后在无限的情况下进行处理,而再次循环可以锁定互惠件,而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),但是一旦将某些东西纳入标准,您应该强烈考虑使用它。