为线程函数c ++ 11获取多个参数
Posted
技术标签:
【中文标题】为线程函数c ++ 11获取多个参数【英文标题】:Take multiple arguments to the thread function c++11 【发布时间】: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_promise
s,要么使用左值引用
当然可以使用多参数线程函数。但是代码有上面提到的一个问题,反正也不完整。
@KABoissonneault 我创建了。但是这里没有提到
发布minimal reproducible example。由于您省略了某些内容而无法使用的代码“这不起作用”是没用的。用一堆不相关的代码“这不起作用”是没用的。关注minimal reproducible example 链接并发布一个实际的最小完整示例。
【参考方案1】:
(未添加评论以便我可以正确附加代码)我完成了您提交的代码以便它编译,我可以确认下面的代码编译并使用命令g++ test.cpp -std=c++11 -pthread
运行良好:
#include <iostream>
#include <thread>
#include <future>
using namespace std;
struct Structure
int el1;
int el2;
;
void func(struct Structure, std::promise<const char *> && v_Promise)
cout<<"Hello"<<endl;
//doing work
int main()
std::thread a_Threads[5];
Structure my_struct;
std::promise<const char*> v_promise;
for(int8_t i = 0; i < 5; i++)
a_Threads[i] = std::thread(func, my_struct, std::move(v_promise));
请与您可能遗漏的任何拼写错误或信息交叉引用。
【讨论】:
是的,同时使用 clang++ (3.8) 和 g++ (4.9),它会打印 hello 几次。 你确定 func 被声明为 void 吗? 你能运行我发布的代码吗?如果没有,您的库可能有问题。 你真的需要用-pthread
编译才能使用<thread>
吗?
在我的设置中,是的,没有尝试过并且无法编译以上是关于为线程函数c ++ 11获取多个参数的主要内容,如果未能解决你的问题,请参考以下文章