为什么我的代码中没有任何竞争条件? 由于来源: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));
}
}
答案 0 :(得分:3)
数据竞赛不会导致编译失败;他们产生不确定的行为。那种行为可能“工作正常”。或者“似乎工作得很好,但在12分钟后巧妙地打破了一些东西”。或者“立即失败。”
仅仅因为代码出现才能发挥作用并不意味着它实际上就是这样。对于线程代码而言,这比任何其他类型更为真实。
答案 1 :(得分:0)
我建议你使用valgrind工具 - helgrind。 调试多线程程序时,很难找到竞争条件。 要运行此工具,您需要在计算机上安装valgrind并使用以下命令运行它:
valgrind --tool=helgrind ./Your_Complied_File arg1 arg2 ...