C ++ - 加入线程向量

时间:2016-07-16 15:09:27

标签: c++ multithreading c++11

我正在使用g ++ 4.8编写c ++ 11程序。我试图将单线程程序转换为多线程程序。线程版本中的连接最终会引发编译错误。你能告诉我哪里出错吗?

单螺纹(效果很好): 请注意,所有参数都通过引用传递。

for (const auto& i : vec_clients)
{
    i->startSim(vec_masters, vec_trace1, vec_trace2, vec_trace3);
}

多线程版本:

std::vector<std::thread> vec_thr;
for (const auto& i : vec_clients)
{
    std::thread t1(&Client::startSim, std::move(i), std::move(vec_trace1), std::move(vec_trace2), std::move(vec_trace3));
    vec_thr.push_back(std::move(t1));
}
for (unsigned int i=0; i<vec_thr.size(); ++i)
{
    // if (i.joinable())
        vec_thr.at(i).join();
}

修改(更简单的例子):

class Test
{
private:
public:
    void testme(const std::string& _str)
    {
        std::cout << "Hello "+_str << std::endl;
    }
};

int main(const int argc, const char **argv)
{
    std::string str = "there";
    Test t1;
    std::vector<std::thread> vec_thr;
std::thread thr1(&Test::testme, std::move(t1), std::cref(str));
    vec_thr.push_back(thr1);
    return 0;
}

2 个答案:

答案 0 :(得分:3)

整数i没有joinable成员函数(或任何成员函数,因为它是基本类型)。它应该是:

for (unsigned int i=0; i<vec_thr.size(); ++i)
{
    if (vec_thr[i].joinable())
        vec_thr.at(i).join();
}

或者只是在线程上使用join。我认为没有特别的理由在这里进行joinable测试,因为你不是detaching任何线程。

答案 1 :(得分:0)

如果有人仍然感兴趣,这就是答案:

class Test
{
private:
public:
    void testme(const std::string& _str)
    {
        std::cout << "Hello "+_str << std::endl;
    }

    void testme2(const std::string& _str)
    {
        std::cout << "Hello to "+_str << std::endl;
    }
};

int main(const int argc, const char **argv)
{
    std::string str = "there";
    std::unique_ptr<Test> up1(new Test());
    std::unique_ptr<Test> up2(new Test());
    std::vector<std::thread> vec_thr;
    std::thread thr1(&Test::testme, std::move(up1), std::ref(str));
    std::thread thr2(&Test::testme2, std::move(up2), std::ref(str));
    vec_thr.push_back(std::move(thr1));
    vec_thr.push_back(std::move(thr2));
    for (unsigned int i=0; i<vec_thr.size(); ++i)
    {
        vec_thr.at(i).join();
    }
    return 0;
}