【问题标题】:Moving an object to a thread with std::threads?使用 std::threads 将对象移动到线程?
【发布时间】:2015-03-18 05:05:53
【问题描述】:

我有一个基本的生产者/消费者应用程序,其中一些工作人员去执行一个共享问题的任务。使用并发 for 或类似的东西还不够简单。我已经习惯使用 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 并将所有内容作为参数传递给工作函数,但我很好奇是否有办法根据标准库编写上述代码。

我想我可以做类似的事情

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

然后线程化,但随后所有内容都封装在foo 中。使用 Qt,我可以在其范围内的任何位置访问该线程对象。

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

【问题讨论】:

    标签: multithreading qt c++11 stdthread


    【解决方案1】:

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

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

    或者可以制作 Worker 方法

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      相关资源
      最近更新 更多