我正在尝试编写一个允许多个读取器或只有一个写入器访问数据的类。问题是,读取器可以有条件地成为写入器,我希望确保无论有多少线程想成为写入器,只允许一个线程成为写入器,其他线程等待写入器完成并被改回读取器。
问题出在if(condition)语句上,因为这可能会被多个线程评估为真,导致它们都试图成为写入者,即使数据只需要写一次。
class Test {
public:
int getData() {
boost::shared_lock<boost::shared_mutex> lock(access_);
if(condition) {
writeData();
}
// Do stuff
}
void writeData() {
// Get exclusive access
boost::upgrade_to_unique_lock<boost::shared_mutex> unique_lock(access_);
// Do stuff
}
private:
boost::shared_mutex access_;
}发布于 2012-02-09 23:38:38
所以我让它以一种可以接受的方式工作。基本上,如果需要写操作,我会释放共享锁,然后写函数将获得唯一锁。在write函数中获得唯一锁之后,它再次检查以确保仍需要执行write操作来处理多个线程认为它们需要写入数据的情况。
我知道这并不理想,因为当只有一个线程需要唯一锁时,在多线程中等待唯一锁所花费的时间很长。但是,就目前而言,性能已经足够好了,并且比以前有了很大的改进。
class Test {
public:
int getData() {
boost::shared_lock<boost::shared_mutex> lock(access_);
if(need_write) {
lock.unlock();
writeData();
lock.lock();
}
// Do stuff
}
void writeData() {
// Get exclusive access
boost::unique_lock<boost::shared_mutex> unique_lock(access_);
if(need_write) {
return;
}
// Do stuff
}
private:
boost::shared_mutex access_;
}https://stackoverflow.com/questions/8931519
复制相似问题