我试图让以下测试程序运行:
#include <thread>
#include <iostream>
using namespace std;
struct foo
{
void t1()
{
for(int i = 0; i < 5; ++i)
cout << "thread 1" << endl;
}
thread bar()
{
return thread(&foo::t1, this);
}
};
void t2()
{
for(int i = 0; i < 5; ++i)
cout << "main " << endl;
}
int main()
{
foo inst;
inst.bar();
thread x(t2);
return 0;
}
&#34;主题1&#34;运行,但应用程序终止,当它应该运行线程&#34; x&#34; 输出是:
/home/user/dev/libs/llvm-3.4.2/bin/clang++ -std = c ++ 11 -Wall -Wextra -pthread main.cpp -o&#39;应用程序&#39; ./'Application'没有活动异常线程调用终止1线程1线程1线程1线程 1 make: * [all] Aborted
目标是使用另一个函数中的对象实例同时运行2个线程。
答案 0 :(得分:4)
您需要加入(或分离)该主题:
int main()
{
foo inst;
inst.bar();
thread x(t2);
x.join(); //<-------
return 0;
}
否则你会看到中止。 加入将等待线程完成。
请注意,bar
已经为您返回了一个您尚未加入的主题,这会产生同样的问题。有点像...
int main()
{
foo inst;
auto y = inst.bar();
thread x(t2);
x.join();
if (y.joinable())
y.join();
return 0;
}
你可能想要考虑像std :: async这样的东西。
答案 1 :(得分:1)
这是因为当main
函数退出时,进程退出。您需要等待线程从当前进程完成(joining them)或detach them。