我如何分别创建和启动线程

时间:2018-11-21 01:27:28

标签: c++ multithreading

我要做的是创建一些线程,并将其推入向量中,以便在进行某些检查后启动它们。

所以在我的主菜单中,我想按照以下步骤创建主题

int main()
{

    Pont pont;

    for (int k = 0; k <= 20; k++) {
        std::thread th(crossBridge);
        pont.threadsW.push_back(std::move(th));
    }

    pont.init();
    return 0;
}

并在此处启动主题:

void WestToEast()
{
    cout << "préparation du trafic vers l'est \n";
    while (true) {
        std::unique_lock<std::mutex> lock(mut);
        while (!notified2) {
            cond.wait(lock);
        }

        while (!threadsE.empty() && j < 10) {
            j++;

            ""
            "  i want to launch theme here "
            ""
        }
        j = 0;
        notified1 = true;
        notified2 = false;
    }
}

每个建议都受到赞赏,一旦启动并从载体中删除,如何加入主题

ps:我刚刚发布了代码的相关部分

1 个答案:

答案 0 :(得分:3)

您可以使用默认构造的(空)线程对象填充向量。

for (int k = 0; k<=20; k++)
    pont.threadsW.push_back({}); // populate vector with empty thread objects

完成检查后,将每个矢量对象与一个线程函数相关联。

for (auto& th : pont.threadsW)
    th = thread(crossBridge);

您并没有真正创建线程并将其推迟到启动之前。而是使用空线程对象填充向量。一旦将新线程移到矢量线程对象中,就会创建实际线程并开始运行。

完成后,在每个线程对象上调用join()

for (auto& th : pont.threadsW)
    th.join();

如果在执行启动前检查时线程功能需要处于运行状态,则需要额外的同步,其中每个线程都在等待全清除信号后才能继续运行。