是否有可能在线程下创建一个新线程

Is it possible to create a new thread under a thread?

本文关键字:线程 有可能 一个 新线程 创建 是否      更新时间:2023-10-16

我有一个问题:人类可以在thread t下创建一个新的thread tt吗?这个新的thread tt需要使用class A中的成员函数memberfunction()thread tclass A中调用一个独立的函数D()。函数D()调用memberfunction()

这些是我的粗略代码:

class A
{
public:
  int memberfunction();
};
void D ()
{
  A class;
  boost::function<int()> f;
  f = boost::bind(&A::memberfunction, &class);   
  boost::thread tt(f);
}
void main()
{
  ...
  boost::thread t(D);
}

步骤boost::thread tt(f);无法创建新线程。你知道吗?或者其他方法?

是可能的。

首先,下次请提供一个最小的,可编译的例子,例如

#include <functional>
#include <thread>
class A
{
    public:
        int memberfunction() { return 0; }
};
void D ()
{
    A x;
    std::function<int()> f;
    f = std::bind(&A::memberfunction, &x);   
    std::thread tt(f);
    tt.join();
}
int main()
{
    std::thread t(D);
    t.join();
    return 0;
}

(Compile with c++ -std=c++11 -pthread file.cpp)

请注意,我用std::thread代替boost::thread,用std::bind代替boost::bind,我假设两者是相同的。

我还插入了一些join调用。如果线程仍然是joinable(), std::thread的析构函数会抛出异常。如果您没有调用joindetach,则会出现这种情况。

不太相关,但你应该避免在其他地方使用关键字,即不要将变量命名为class