无法调用带参数的线程函数

Posted

技术标签:

【中文标题】无法调用带参数的线程函数【英文标题】:Calling threaded functions with arguments not possible 【发布时间】:2017-02-14 11:48:34 【问题描述】:

我知道这个问题看起来与已经回答的问题相似,但由于给他们的答案对我不起作用,我不认为这个问题是他们的重复问题

我很清楚这个问题:我如何将 c++ 函数调用为具有 1 个或多个参数的线程已被多次回答——无论是在此处还是在各种教程中——并且在每种情况下,答案都是简单地说这是这样做的方法:

(示例直接取自this question)

#include <string>
#include <iostream>
#include <thread>

using namespace std;

// The function we want to execute on the new thread.
void task1(string msg)

    cout << "task1 says: " << msg;


int main()

    // Constructs the new thread and runs it. Does not block execution.
    thread t1(task1, "Hello");

    // Makes the main thread wait for the new thread to finish execution, therefore blocks its own execution.
    t1.join();

但是,我尝试复制粘贴此代码和更多(或多或少相同)如何执行此操作的示例,但是,每次我编译(通过诸如 g++ test.cpp -o test.app 之类的终端时(必须添加 .app,因为我在 Mac 上(请注意,这种编译方式实际上对我有用,而且该错误根本不是因为我不知道如何编译 c++ 程序)))程序我收到此错误消息:

test.cpp:16:12: error: no matching constructor for initialization of 'std::__1::thread'
    thread t1(task1, "Hello");
           ^  ~~~~~~~~~~~~~~
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/thread:389:9: note: candidate constructor template not viable: requires single argument '__f', but
      2 arguments were provided
thread::thread(_Fp __f)
        ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/thread:297:5: note: candidate constructor not viable: requires 1 argument, but 2 were provided
    thread(const thread&);
    ^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/thread:304:5: note: candidate constructor not viable: requires 0 arguments, but 2 were provided
    thread() _NOEXCEPT : __t_(0) 

因此,我的问题是,与所有可以使用参数创建线程函数的人相比,我做错了什么,并且由于我没有发现遇到类似问题的人提出的任何问题,我不认为这一点质疑许多我如何使用参数调用线程函数的副本

据我所知,使用线程不需要任何特定的编译器标志,并且由于我完全可以运行带有线程函数的程序而无需参数,因此您不能声称我的计算机或编译器无法完全使用线程。

【问题讨论】:

如果你这样做g++ --version 它会报告什么?您是否有不完全支持 C++11(添加了 std:thread 的标准)的非常旧版本的 Clang(在 macOS 上 gccg++ 通常是 Clang 编译器的别名)?跨度> 将线程进程改为char const * 添加编译器开关 -std=c++11. 在这里工作:cpp.sh/5w4z5 可能你必须检查你的编译器版本 @ErikAlapää 你是对的,这解决了它。 (如果您将其作为答案发布,我可以接受) 【参考方案1】:

根据 gcc 版本,您应该添加编译器开关 -std=c++11 或 -std=c++0x。

【讨论】:

【参考方案2】:

我可以编译它here

使用 C++14 并得到如下输出。

task1 says: Hello

使用-std=c++11或以上标志编译。

【讨论】:

以上是关于无法调用带参数的线程函数的主要内容,如果未能解决你的问题,请参考以下文章

无法使用带参数的 ajax 调用来访问我的 C# 函数

在 Swift 中,如何在 GCD 主线程上调用带参数的方法?

无法在python中调用类函数(TypeError:object()不带参数)

调用 UDF 时出现“此函数不带参数”错误

如何将函数作为参数传递,带参数? [复制]

如何定义带参数或不带参数调用的函数? [复制]