我想了解更多关于 std::thread 的信息,特别是如果我有一个线程向量并且其中一个线程完成执行会发生什么。
画出这个例子:
创建了一个线程向量,它们都执行以下函数:
function_test(char* flag)
{
while(*flag == 1) { // Do Something
}
}
'char* flag' 指向指示函数停止执行的标志。
例如,向量包含 10 个线程,它们都在执行。然后线程号 3 的标志设置为零。(向量中的第 4 个线程,因为向量从零开始。)
好的做法是然后加入线程。
vector_of_threads[3].join();
向量现在将包含多少个 std::threads?我可以再次使用相同的功能甚至不同的功能重新启动已完成的线程吗?
我的问题的原因是我有一个线程向量,有时它们会被要求停止执行,然后执行“落在函数的末尾”。
重新启动该线程的一种解决方案(我假设,也许是错误的?)是从向量中删除该元素,然后插入一个新线程,然后该线程将开始执行。这是正确的吗,因为当一个线程停止时,它仍然在向量内吗?我想会是吗?
编辑
'function_test' 不允许修改任何其他功能标志。标志由它们自己的函数和调用函数修改。(为此,想象标志启用主线程和线程之间的通信。)
这是否解决了数据竞争问题,还是仍然是一个问题?