Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 可以在线程下创建新线程吗?_C++_Multithreading_Boost - Fatal编程技术网

C++ 可以在线程下创建新线程吗?

C++ 可以在线程下创建新线程吗?,c++,multithreading,boost,C++,Multithreading,Boost,我有一个问题:人类能否在线程t下创建一个新的线程tt?这个新的线程tt需要在class a中使用成员函数memberfunction()。线程t调用类a之外的独立函数D()。函数D()调用memberfunction() 以下是我的大致代码: class A { public: int memberfunction(); }; void D () { A class; boost::function<int()> f; f = boost::bind(&A:

我有一个问题:人类能否在
线程t
下创建一个新的
线程tt
?这个新的
线程tt
需要在
class a
中使用成员函数
memberfunction()
线程t
调用
类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);
}
A类
{
公众:
int memberfunction();
};
无效D()
{
一个班级;
boost::函数f;
f=boost::bind(&A::memberfunction,&class);
boost::线程tt(f);
}
void main()
{
...
boost::线程t(D);
}
步骤
boost::线程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;
}
#包括
#包括
甲级
{
公众:
int memberfunction(){return 0;}
};
无效D()
{
A x;
std::函数f;
f=std::bind(&A::memberfunction,&x);
标准:螺纹tt(f);
tt.join();
}
int main()
{
标准:螺纹t(D);
t、 join();
返回0;
}
(使用g++-std=c++11-pthread file.cpp编译)

请注意,我将
boost::thread
替换为
std::thread
,将
boost::bind
替换为
std::bind
,并且我假设两者相同

我还插入了一些
join
调用。如果线程仍然是可连接的()
,则
std::thread
的析构函数将引发异常。如果未调用
join
detach
,则会出现这种情况


并非真正相关,但您应避免在任何其他内容中使用关键字,即不要命名变量

请完整描述预期行为和实际行为。提供一个完整的、自包含的示例,该示例只需编译即可。你不太可能简单地启动tt而什么也不做。线程与访问可见性无关。@gd1出于机密原因,我无法提供完整的示例。编译时没有错误。在VS2010的调试窗口中,我看到线程tt没有被创建,而线程t被成功创建。事实上,您必须构建一个自包含的示例来演示您所描述的问题。谷歌搜索SSCCE。提供不可编译的代码示例(这不是问题的主题)会让人恼火。@gd1感谢您的建议。我下次再做谢谢你的回答。创建了线程tt。我在一家公司从事一个大项目,我无法提供原始代码,因此我重写了它。你说得对,下次我会提供一个可以编译的例子。