我运行这段代码
class ttt {
public:
~ttt() {
LOG(INFO);
flush();
}
bool flush() {
//std::lock_guard<boost::fibers::mutex> lock(_mutex);
LOG(INFO);
_mutex.lock();
LOG(INFO);
auto ret = flush_nonlock();
LOG(INFO);
_mutex.unlock();
LOG(INFO);
return ret;
}
private:
bool flush_nonlock() {
LOG(INFO);
return std::rand()%2;
}
boost::fibers::mutex _mutex;
};
int main() {
static ttt t;
std::cout << t.flush() << std::endl;
return 0;
}
我得到了
terminate called after throwing an instance of 'boost::fibers::lock_error'
what(): boost fiber: a deadlock is detected: Resource deadlock avoided
它打印的最后一个日志在 _mutex.lock() 之前。如果 t 不是静态变量,则不会抛出任何错误。如果我在主函数中删除 t.flush(),它不会抛出任何错误。使用我在笔记中写的 std::lock_guard ,它旁边的行没有打印出来。我无法弄清楚我尝试过的案例的原因和差异是什么。
我使用 gcc 5.4.0 构建代码,使用 -O0