当前位置:  开发笔记 > 编程语言 > 正文

从C++ std :: vector中的线程中启动可运行对象

如何解决《从C++std::vector中的线程中启动可运行对象》经验,为你挑选了1个好方法。

我有一个C++ 11程序,它配置了许多可运行的对象,将它们放在一个std::vector,然后在不同的线程中启动它们.不幸的是,当我迭代向量中的对象时,我只是为最后一个对象启动了线程.我已经在以下测试代码中将问题提炼到了核心(在OSX 10.9.5上clang++ -std=c++11 cpp_threadlaunch.cpp使用clang6.0 编译).

#include 
#include 
#include 
#include 

std::mutex  outputlock;

class agent {

public:
    agent(std::string name) : m_name(name) {};
    ~agent(void) {};

    void run(void) {
        while (1) {
            outputlock.lock();
            std::cout << "Agent: " << m_name << std::endl;
            outputlock.unlock();
            sleep(1);
        }
    }
    std::string     getName(void) { return m_name; }

private:

    std::string     m_name;
};

int main()
{
    std::vector        threads;
    std::vector             agents;
    // std::string                  goal = "succeed";
    std::string                     goal = "fail";

    agents.push_back(new agent("A"));
    agents.push_back(new agent("B"));

    if (goal == "succeed") {

        threads.push_back(std::thread([&]() { agents.at(0)->run(); }));
        threads.push_back(std::thread([&]() { agents.at(1)->run(); }));

    }
    else {

        for (auto it = agents.begin(); it != agents.end(); it++) {

            agent* a = *it;

            std::cout << "Launching thread for " << a->getName() << std::endl;

            threads.push_back(std::thread([&]() { a->run(); }));
        }
    }

    for (auto it = threads.begin(); it != threads.end(); it++) {

        it->join();
    }

    exit(0);
}

当我跑步时goal = "succeed",我得到了希望的输出

Agent: A
Agent: B
Agent: A
Agent: B

当我运行时goal = "fail",我只从一个对象获得两个输出副本,而不是每个对象的输出:

Launching thread for A
Launching thread for B
Agent: B
Agent: B
Agent: B
Agent: B

我怀疑我在这里遗漏了一些不足之处 - 如果有人能够解释发生了什么以及解决方案是什么,我会非常感激.谢谢 -



1> Kevin..:

std::thread在循环中传递的lambda函数a通过引用捕获.从那时a起超出范围你有未定义的行为.按值捕获(使用[=]而不是[&]).

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有