【问题标题】:How to pass the target function of std::thread constructor as an argument如何将 std::thread 构造函数的目标函数作为参数传递
【发布时间】:2021-12-30 00:00:31
【问题描述】:

我可以这样做来开始我的话题:

int main_test() {
  // do something...
  return 0;
}

std::thread* myThread;

void myFunction() {
  myThread = new std::thread(main_test);
}

如何将main_test 作为参数传递给myFunction,以便使用不同的目标函数可以使用相同的函数来启动线程?那么myFunction的签名会是什么呢?

我想我不明白的是,std::thread 构造函数的模板版本是如何使用指定类型调用的。

【问题讨论】:

  • 您可以使用与std::thread 相同的代码来接受构造函数中的参数。我不明白你关于身份的问题,你是说类型吗?
  • 附带说明,在您的情况下,不需要使用 new 运算符进行动态分配。在堆栈上创建它,如myThread = std::thread(main_test);
  • @Ulrich Eckhardt 我认为他的身份是指函数的签名。
  • 是签名,谢谢。现已修复
  • 不过,你基本上可以从std::thread复制代码。

标签: c++ c++11 stdthread


【解决方案1】:
std::thread myThread;

myThread 的类型是std::thread

myThread = new std::thread(main_test);

new std::thread(main_test) 返回std::thread*。您不能将std::thread* 分配给std::thread。程序格式不正确。

解决方案:似乎没有理由使用动态分配。只需像这样分配一个临时对象:

myThread = std::thread(main_test);

如何将 main_test 作为参数传递给 myFunction,以便可以使用相同的函数来使用不同的目标函数启动线程?那么 myFunction 的身份是什么?

您可以将您的myFunction 设为具有与std::thread 完全相同的参数的模板,然后转发所有内容。或者,如果您想保持简单,可以使用函数指针。

【讨论】:

    【解决方案2】:

    如何将 main_test 作为参数传递给 myFunction,以便可以使用相同的函数来使用不同的目标函数启动线程?

    您可以将指针作为参数传递给您的函数

    void myFunction(int (*func)()) {
    myThread = new std::thread(func);
    }
    
    int callSelector(int someCriteria)
    {
        if (someCriteria == 0) {
            myFunction(main_test1);
        }
        else {
            myFunction(main_test2);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 2015-08-02
      • 2016-07-19
      • 2013-08-12
      • 2015-03-23
      相关资源
      最近更新 更多