类的std :: thread调用方法[重复]

Posted

技术标签:

【中文标题】类的std :: thread调用方法[重复]【英文标题】:std::thread calling method of class [duplicate] 【发布时间】:2012-06-15 11:03:06 【问题描述】:

可能重复:Start thread with member function

我有一个小班:

class Test

public:
  void runMultiThread();
private:
  int calculate(int from, int to);
  

如何在方法runMultiThread() 的两个线程中使用两组不同的参数(例如calculate(0,10)calculate(11,20))运行方法calculate

PS 谢谢我忘了我需要传递this 作为参数。

【问题讨论】:

【参考方案1】:

没那么难:

#include <thread>

void Test::runMultiThread()

    std::thread t1(&Test::calculate, this,  0, 10);
    std::thread t2(&Test::calculate, this, 11, 20);
    t1.join();
    t2.join();

如果仍然需要计算结果,请使用 future 代替:

#include <future>

void Test::runMultiThread()

     auto f1 = std::async(&Test::calculate, this,  0, 10);
     auto f2 = std::async(&Test::calculate, this, 11, 20);

     auto res1 = f1.get();
     auto res2 = f2.get();

【讨论】:

@ravenspoint:是否线程安全取决于 OP,不是吗?我同意应该恢复返回值,尽管 OP 并未表明这是有意的(它可能类似于 printf)。 std::async 将是一个替代方案。 @JonathanWakely 也许是因为 OP 这么问?虽然我们一开始不知道他的方法是否正确,但也许他同时进行了其他计算。 @ravenspoint:这个问题询问了如何在具有不同参数的不同线程中运行一个函数,这个答案清楚地展示了如何做到这一点。这怎么没用? @ravenspoint:这些是其他问题;还有其他个问题。 我不认为线程数会成为争论的焦点。我只是在演示技术;我相信 OP 可以以任何适合她最终并发需求的方式安排代码。

以上是关于类的std :: thread调用方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java创建多线程方式之一:继承Thread类

线程类的构造方法静态块是被哪个线程调用的

继承std::thread时如何安全调用成员函数

如何放弃或取消 std::thread

通过指向派生类的函数调用基本虚方法

围绕函数调用 std::thread() 的工作方式不同