使用std :: threads将对象移动到线程?

时间:2015-01-20 03:41:10

标签: multithreading qt c++11 stdthread

我有一个基本的生产者/消费者应用程序,其中一些工作人员去处理共享问题的任务。使用并发或类似的东西并不是一件容易的事。我已经习惯使用Qt进行线程处理,因为它可以很容易地做到这样的事情:

for(int i = 0; i < nworkers; i++){
    Worker* myworker = new Worker();
    QThread* thread = new QThread;
    myworker->attachToThread(thread);

    myworker->doSomething(someArgument);
    myworker->doSomethingElse(someOtherArgument);
    myworker->run();
}

我想尝试切换到部分地使用std::thread进行学习练习,部分使我不需要在Qt中链接。所以我的问题是,是否有一种简单的方法来分离线程中的对象,然后从中调用函数?在这种情况下,上面的模型非常有效。老实说,对于我的应用程序,我可以使用std::async并将所有内容作为参数传递给worker函数,但我很好奇是否有办法用标准库编写上述代码。< / p>

我想我可以做点像

void foo(someArguments){
    Worker* myworker = new Worker();
    myworker->doSomething(someArguments);
    myworker->run();
}

并线程化,然后将所有内容封装在foo中。使用Qt,我可以在范围内的任何地方访问该线程对象。

我理解在使用标准库的另一个线程中运行函数的基础知识,但我想知道我想要的东西是否只有在更大框架的帮助下才能实现?

1 个答案:

答案 0 :(得分:0)

您想将类方法作为线程函数运行吗?

std::thread t(&Worker::run, myworker, arg1, arg2, ...);
t.join();

或者可以制作工人方法

Worker::runT() {
  doSomething();
  doMore();
  std::thread t(&Worker::run, this);
}

你可以把.join()放在某个地方,或者放在析构函数中