我正在尝试编写一个允许多个读者或只有一个编写者访问数据的类。问题是读者可以有条件地成为一个编写者,我想确保无论有多少线程想成为编写者,只允许一个,而其他线程等待编写者完成并更改回读者。
问题出在if(condition)
语句,因为多线程可以将它评估为true,导致它们都尝试成为编写器,即使数据只需要写一次。
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_;
}
答案 0 :(得分:1)
所以我以可接受的方式工作。基本上,如果需要写入,我会释放共享锁,然后写入函数将获得唯一锁定。在获取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_;
}