传递给线程

时间:2016-03-03 06:37:42

标签: c++ multithreading c++11

我有一个图形对象,我将传递给这样的线程:

void MyClass::execute_subqueries(Graph& g, vector<query>&& queries) {
  for (size_t i = 0; i < queries.size(); i++) {
    threads.emplace_back(thread(my_thread, ref(g), queries[i]));
  }
}

我想制作一个Graph对象g的副本,因为我会在我的线程运行时对其进行更改。我只想制作一个副本并传递对我在for循环中开始的所有线程的引用。我不想为每个帖子制作副本,因为图表很大并且克隆它的成本很高。

问题是我无法弄清楚如何让我的Graph对象保持活着状态。我认为在传入引用后,Graph对象被释放,我的线程不会产生我期望的结果。有什么好办法呢?

3 个答案:

答案 0 :(得分:1)

你的旗帜告诉我你使用的是c ++ 11,所以你为什么不使用

std::vector< std::shared_ptr<Graph> > graphs;

并将共享指针传递给线程?只要它们被使用,它们就会使你的图表保持活着,并在之后进行清理......

答案 1 :(得分:1)

由于您想要制作图表的副本,您也可以将其放在std::shared_ptr中,并将其传递给每个线程(请注意,您将传递的副本相同的指针,因此每个线程不会有副本)。

考虑这样的事情:

// A vector of pointers to Graph
vector<shared_ptr<Graph>> graphs;

...

// Make a shared allocated copy.
graphs.emplace_back(std::make_shared<Graph>(g));

(请注意,这需要c ++ 11设置。)

答案 2 :(得分:0)

可以使用其他答案中建议的shared_ptr来完成,但这实际上取决于您的程序正在做什么。在for循环之前可以尝试:

std::shared<Graph> gPtr(new Graph(g));
//std::shared<Graph> gPtr(g.clone()); // guess, you mentioned cloning

然后启动线程。命名可以更好。我认为my_thread不是一个线程实例而是一个函数(否则它不会编译)。让它采用shared_ptr而不是引用等。

你可能意味着 - 如果thread是std :: vector(guess):

threads.push_back(std::thread(my_thread_fct, gPtr, queries[i]));

threads.emplace_back(my_thread_fct, gPtr, queries[i]);

@JoachimPileborg是对的 - 需要更多的上下文/代码来了解正在发生的事情。这一切的输出是什么?你会从处理过的克隆图中提取一些东西吗?根据这些设计决策,代码看起来会非常不同......