我已经阅读了许多已经回答的与此相关的问题,但没有一个让我清楚地了解当我有多个作家但只有一个读者时应该使用哪个。下面的代码是我所说的一个人为的例子。
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
orunique_lock
?