gpt4 book ai didi

c++ - 当函数执行结束时, vector 中的线程会发生什么?

转载 作者:行者123 更新时间:2023-11-30 01:58:24 25 4
gpt4 key购买 nike

我想了解更多关于 std::thread 的信息,特别是如果我有一个线程 vector 并且其中一个线程完成执行会发生什么。

想象一下这个例子:

创建了一个线程 vector ,它们都执行以下函数:

function_test(char* flag)
{
while(*flag == 1) { // Do Something
}
}

'char* flag' 指向一个标志,指示函数停止执行。

例如, vector 包含 10 个线程,它们都在执行。然后将线程号 3 的标志设置为零。( vector 中的第 4 个线程,因为 vector 从零开始。)

好的做法是加入线程。

vector_of_threads[3].join();

vector 现在将包含多少个 std::threads?我可以再次使用相同的函数或什至不同的函数重新启动已完成的线程吗?

我的问题的原因是我有一个线程 vector ,有时它们会被要求停止执行,然后执行“从函数的末尾掉下来”。

重启该线程的一种解决方案(我假设,也许不正确?)是从 vector 中删除该元素,然后插入一个新线程,该线程随后将开始执行。不过,这是正确的吗,因为当线程停止时,它还会在 vector 中吗?我猜是吧?

编辑

'function_test' 不允许修改任何其他函数标志。这些标志由它们自己的函数和调用函数修改。 (为此目的,想象标志启用主线程和线程之间的通信。)

这是否解决了数据竞争问题,还是仍然是一个问题?

最佳答案

这不是您要问的具体内容,而是 flag应该是 atomic<char>*或者你有一个 data race ,即未定义的行为。此外,如果它只适用于真或假,我会使用 atomic<bool>*并测试 if (*flag) .

至于你的实际问题:

How many std::threads will the vector now contain?

它将包含与之前完全相同的数字,但其中一个不再是“可连接的”,因为它不代表正在运行的线程。当线程停止运行时,它不会神奇地改变 vector 以删除元素,它甚至不知道 vector 存在!主线程中唯一可见的变化是调用 vector_of_threads[3].join()不会阻塞并且会立即返回,因为线程已经结束所以你不必等待加入它。

您可以删除连接的 std::thread从 vector 中插入一个新的,但另一种选择是分配另一个 std::thread它代表一个新的执行线程:

vector_of_threads[3] = std::thread(f, &flags[3]);

现在vector_of_threads[3]表示一个正在运行的线程并且再次“可连接”。

关于c++ - 当函数执行结束时, vector 中的线程会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17474831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com