请考虑以下代码段:
线程1:
while (true) { task = fetch_task(); { lock_guardlock(my_mutex); // modify content of my_list my_list.push_back(task); } }
线程2:
while (true) { if (!my_list.empty()) { { lock_guardlock(my_mutex); // modify content of my_list if (!my_list.empty()) { task = my_list.pop_front(); } } if (taks) { handle_taks(task); } } do_some_other_stuff(); }
我知道这个代码在很多层面都很差(比如异常处理),而且在任务处理方面还有更好的方法 - 我只对一个方面感兴趣:
我my_list.empty()
在互斥范围之外调用(可能是为了避免锁定my_mutex
性能危急情况).
闻起来很糟糕,我不打算这样做 - 但我想知道真正发生了什么.empty()
返回bool
- 我可以假设至少这个电话是安全的吗?
当然,在我打电话后内容可能已经改变,empty()
所以我必须通过再次检查empty()
互斥范围内来避免竞争条件.
所以我的问题是 - 这种代码在假设中可以假设有关于误报,漏报甚至崩溃的影响吗?
对来自至少一个线程正在写入的不同线程的标准库类成员的非同步访问导致数据争用(除非明确定义,否则通常不是这种情况).数据竞争是未定义的行为.未定义的行为可能导致任意结果.
换句话说:列表中的所有内容都可能发生.许多其他事情也可能发生.