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