【发布时间】:2017-11-30 15:21:41
【问题描述】:
我对并发编程很陌生,我有一个特定的问题,我无法通过浏览互联网找到解决方案。..
基本上我有这种情况(示意图伪代码):
void fun1(std::vector<std::shared_ptr<SmallObj>>& v) {
for(int i=0; i<v.size(); i++)
.. read and write on *v[i] ..
}
void fun2(std::vector<std::shared_ptr<SmallObj>>& w) {
for(int i=0; i<w.size(); i++)
.. just read on *w[i] ..
}
int main() {
std::vector<std::shared_ptr<SmallObj>> tot;
for(int iter=0; iter<iterMax; iter++) {
for(int nObj=0; nObj<nObjMax; nObj++)
.. create a SmallObj in the heap and store a shared_ptr in tot ..
std::vector<std::shared_ptr<SmallObj>> v, w;
.. copy elements of "tot" in v and w ..
fun1(v);
fun2(w);
}
return 0;
}
我想要做的是同时操作产生两个线程来执行 fun1 和 fun2 但我需要使用一些锁定机制来规范对 SmallObj 的访问。我该怎么做?在文献中,我只能找到使用互斥锁来锁定对特定对象或部分代码的访问的示例,但不能找到不同对象(在本例中为 v 和 w)对相同指向变量的访问。
非常感谢您,并为我对此事的无知感到抱歉..
【问题讨论】:
-
只需将修改代码包装在互斥体中即可。这样一次只有一个线程修改。
-
没有法律要求给定的互斥锁只能用于锁定单个对象。您可以创建一个互斥锁,并在您想要访问与共享指针相关的任何内容时锁定同一个互斥锁。结束。
-
您是只读/写向量中的对象还是自己修改向量?如果是前者,则无需复制向量。顺便说一句:如果你在没有 std::reference_wrapper 的情况下使用 std::thread,无论如何你都会得到你的副本......
标签: c++ multithreading c++11 shared-ptr