为线程函数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_promises,要么使用左值引用 当然可以使用多参数线程函数。但是代码有上面提到的一个问题,反正也不完整。 @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编译才能使用&lt;thread&gt;吗? 在我的设置中,是的,没有尝试过并且无法编译

以上是关于为线程函数c ++ 11获取多个参数的主要内容,如果未能解决你的问题,请参考以下文章

C++11 ——— 线程库

C++11 ——— 线程库

如何在 LLVM 中获取函数指针

python获取外部传入多个参数

循环使用多个参数获取值

django 表单为关键字参数获取了多个值