【发布时间】:2016-05-03 18:19:05
【问题描述】:
我有一个线程数组,在for 循环中我应该为所有线程创建一个线程。
问题是其中一个参数是std::move(promise_var),另一个是结构。当我尝试编译它时,编译给了我一个错误:
错误:没有匹配函数调用‘
std::thread::thread(void (&)(Function), Structure [nNumThreads], std::remove_reference<std::promise<const char*>&>::type)’
那么,这里是简化版的代码……
func(struct Structure, std::promise<const char *> && v_Promise){
//doing work
}
main(){
std::thread a_Threads[5];
for(int8_t i = 0; i < 5; i++){
a_Threads[i] = std::threads(func, Structure, std::move(v_promise[i]));
}
}
【问题讨论】:
-
我不确定你是否可以做你想做的事,但我不认为你想做。在循环中,您将相同的对象移动到每个线程中。第一次迭代后,
v_promise不应再被使用,因为它的内容已被移到线程中。 -
如果
func采用对std::promise的右值引用,这意味着它可能“从”v_promise“移动”并离开v_promise处于未指定的、可能不可用的状态。在这种情况下,每个线程如何使用相同的对象?要么创建 5 个v_promises,要么使用左值引用 -
当然可以使用多参数线程函数。但是代码有上面提到的一个问题,反正也不完整。
-
@KABoissonneault 我创建了。但是这里没有提到
-
发布minimal reproducible example。由于您省略了某些内容而无法使用的代码“这不起作用”是没用的。用一堆不相关的代码“这不起作用”是没用的。关注minimal reproducible example 链接并发布一个实际的最小完整示例。
标签: c++ linux multithreading c++11