我要做的是创建一些线程,并将其推入向量中,以便在进行某些检查后启动它们。
所以在我的主菜单中,我想按照以下步骤创建主题
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:我刚刚发布了代码的相关部分
答案 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();
如果在执行启动前检查时线程功能需要处于运行状态,则需要额外的同步,其中每个线程都在等待全清除信号后才能继续运行。