shared_ptr中的竞争条件不会发生

时间:2017-06-14 19:03:47

标签: c++ multithreading thread-safety smart-pointers

为什么我的代码中没有任何竞争条件? 由于来源:http://en.cppreference.com/w/cpp/memory/shared_ptr

  

如果多个执行线程在没有同步的情况下访问相同的shared_ptr,并且任何访问都使用shared_ptr的非const成员函数,那么将发生数据争用;

class base
{
public:
    std::string val1;
};

class der : public base
{
public:
    std::string val2;
    int val3;
    char val4;
};

int main()
{
    std::mutex mm;
    std::shared_ptr<der> ms(new der());

    std::thread t1 = std::thread([ms, &mm]() {
        while (1)
        {
        //std::lock_guard<std::mutex> lock(mm);

            std::string some1 = ms->val2;
            int some2 = ms->val3;
            char some3 = ms->val4;
            ms->val2 = "1232324";
            ms->val3 = 1232324;
            ms->val4 = '1';
        }
    });

    std::thread t2 = std::thread([ms, &mm]() {
        while (1)
        {
            //std::lock_guard<std::mutex> lock(mm);

            std::string some1 = ms->val2;
            int some2 = ms->val3;
            char some3 = ms->val4;
            ms->val2 = "123435";
            ms->val3 = 123435;
            ms->val4 = '3';
        }
    });

    std::shared_ptr<base> bms = ms;
    std::thread t3 = std::thread([bms]() {
        while (1)
        {
            bms->val1 = 434;
        }
    });

    while (1)
    {
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
    }
}

2 个答案:

答案 0 :(得分:3)

数据竞赛不会导致编译失败;他们产生不确定的行为。那种行为可能“工作正常”。或者“似乎工作得很好,但在12分钟后巧妙地打破了一些东西”。或者“立即失败。”

仅仅因为代码出现才能发挥作用并不意味着它实际上就是这样。对于线程代码而言,这比任何其他类型更为真实。

答案 1 :(得分:0)

我建议你使用valgrind工具 - helgrind。 调试多线程程序时,很难找到竞争条件。 要运行此工具,您需要在计算机上安装valgrind并使用以下命令运行它:

valgrind --tool=helgrind ./Your_Complied_File arg1 arg2 ...