我已经阅读了许多关于这个问题的答案,但是没有一个给我清晰地理解当我有多个写入者但只有一个读取者时该使用哪个。下面的代码是我所说的一个人为的例子。
struct StateInfo {
long wd{};
uint32_t perc{};
};
class Blah
{
const int numDevices = getDevices();
std::shared_mutex sharedMutexSI_;
vector<StateInfo> stateInfo;
public:
Blah() : stateInfo(numDevices){};
void writers(StateInfo &newSi, const int i)
{
std::shared_lock<std::shared_mutex> _MULTIPLE(sharedMutexSI_);
stateInfo[i] = newSi;
}
StateInfo reader(const int i)
{
std::lock_guard<std::shared_mutex> _EXCLUSIVE(sharedMutexSI_);
return stateInfo[i];
}
};
现在的情况是多个编写者可能同时更新stateInfo向量,但它们不会更新向量中相同的项,因为i 是每个线程唯一的。一个单独的读取线程可以随时尝试读取任意的向量项。
以上代码是否正确避免了竞争条件?
lock_guard
是否是合适的锁定方式,还是应该使用scoped_lock
或unique_lock
?
scoped_lock
的功能,那么lock_guard
是最简单的选择,我应该坚持使用最简单的方法? - pobylock_guard
和scoped_lock
在其实现上是相同的。 - Evglock_guard
、scoped_lock
和unique_lock
:请参见此处的专门问题和答案(https://dev59.com/bFgQ5IYBdhLWcg3wRR5j)。 - anatolygstd::mutex
或者将StateInfo
设为原子类型。无论如何,该类都存在虚假共享问题,因此我不确定共享锁是否有很大帮助。 - ALX23z