gpt4 book ai didi

c++ - 使用条件编写器提升 shared_mutex

转载 作者:行者123 更新时间:2023-11-28 08:11:39 26 4
gpt4 key购买 nike

我正在尝试编写一个允许多个读者或一个作者访问数据的类。问题是读者可以有条件地成为作家,我想确保无论有多少线程想成为作家,只允许一个,其他线程等待作家完成并变回读者。

问题出在 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_;
}

最佳答案

所以我以可接受的方式让它工作。基本上,如果需要写入,我会释放共享锁,然后写入函数将获得唯一锁。在写函数中获得唯一锁后,它再次检查以确保仍然需要写操作以处理多个线程认为他们需要写入数据的情况。

我知道这并不理想,因为当只有一个线程需要唯一锁时,在多个线程中等待唯一锁所花费的时间。但是,目前的性能已经足够好了,并且比以前有了很大的改进。

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_;
}

关于c++ - 使用条件编写器提升 shared_mutex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8931519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com