我有两个函数foo和bar,它们应该相互排斥,因为它们在相同的数据上操作.然而,foo从bar重复了很多代码,所以我想重构foo来调用bar.
这是一个问题,因为我不能使用一个互斥体的这两个功能,因为那时foo会死锁时调用吧.所以而不是“互斥”我只想“从不同的线程互斥”.
有没有实现这个模式?我正在使用C,如果我需要像shared_mutex这样的东西,我可以C 14 / boost.
解决方法
定义一个私有的“解锁”功能,并使用foo和bar:
void bar_unlocked() { // assert that mx_ is locked // real work } void bar() { std::lock_guard<std::mutex> lock(mx_); bar_unlocked(); } void foo() { std::lock_guard<std::mutex> lock(mx_); // stuff bar_unlocked(); // more stuff }