从类实例和main中运行线程

时间:2014-07-29 10:46:30

标签: c++ multithreading c++11

我试图让以下测试程序运行:

#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个线程。

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