我编写了std::shared_mutex的实现,但是在我的测试中它工作了几分钟,用 notify_all 替换了 notify_one ,它开始工作了20毫秒。这是因为仅唤醒一个条件变量会产生开销,因此它的运行速度比 notify_all 慢。
class RWLock {
public:
template <class Func>
void Read(Func func) {
std::unique_lock<std::mutex> lock(mutex_);
no_writer_.wait(lock, [this] { return !write_; });
++read_cnt_;
lock.unlock();
try {
func();
} catch (...) {
End();
throw;
}
End();
}
template <class Func>
void Write(Func func) {
std::unique_lock<std::mutex> lock(mutex_);
no_readers_.wait(lock, [this] { return read_cnt_ == 0; });
write_ = true;
try {
func();
} catch (...) {
write_ = false;
throw;
}
write_ = false;
no_writer_.notify_all();
}
private:
std::mutex mutex_;
std::condition_variable no_writer_;
std::condition_variable no_readers_;
int read_cnt_ = 0;
bool write_ = false;
void End() {
mutex_.lock();
--read_cnt_;
no_readers_.notify_all();
mutex_.unlock();
}
};
最佳答案
当互斥锁锁定时,您可以发出信号。
您可能想尝试一种常见的优化方法:在调用notify_one
/ notify_all
之前释放互斥量。
关于c++ - 为什么在std::condition_variable notify_all的运行速度比notify_one更快(在随机请求上)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60337398/