当前位置: 首页 > 知识库问答 >
问题:

当函数执行结束时,向量中的线程会发生什么情况?

山寒
2023-03-14

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

想象一下这个例子:

创建一个线程向量,所有线程都执行以下函数:

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

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

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

好的做法是然后加入线程。

vector_of_threads[3].join();

向量现在将包含多少std::线程?我可以用相同的函数重新启动已完成的线程吗,或者甚至可以使用不同的函数?

我提出这个问题的原因是,我有一个线程向量,有时需要它们停止执行,然后执行“从函数的末尾掉下来”。

重新启动该线程的一个解决方案是(我认为,可能是错误的?)将从向量中删除该元素,然后插入一个新线程,该线程将开始执行。但是这是正确的吗?因为当线程停止时,它还会在向量中吗?我想是吧?

编辑

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

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

共有1个答案

国俊艾
2023-03-14

这不是你要问的具体问题,但是标志应该是原子的

至于你的实际问题:

向量现在包含多少d::线程?

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

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

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

现在vector_of_threads[3]表示一个正在运行的线程,并且再次"joinable"。

 类似资料:
  • 来自文档:http://docs.python.org/2/library/thread 让我们在这里只讨论非守护进程线程。因为第一个引号没有特别提到非守护进程线程,所以我假设,如果主线程退出,即使是非守护进程线程也应该被杀死。然而,第二句引文却表明了另一种情况。事实上,当主线程退出时,非守护进程线程确实不会被杀死。那么,这里的第一个引用有什么意义呢?

  • 问题内容: 我知道从线程调用是一个坏主意。但是,如果线程使用创建新进程,将会发生什么? 新进程将是创建线程的主线程的子进程。我认为。 如果其父级先完成,则新进程将附加到init进程中。它的父级是主线程,而不是创建它的线程。 如果我错了,请纠正我。 问题答案: 新进程将是创建线程的主线程的子进程。我认为。 创建一个新的过程。一个进程的父进程是另一个进程,而不是线程。因此,新流程的父级是旧流程。 请注

  • 当您以“正常”方式停止或重新启动tomcat时,正在处理的http请求会发生什么情况?它们将被处理直到响应完成还是http线程被中断?有没有办法配置优雅的停车?

  • 我注意到,在这个javadoc中,https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.htmlUncaughtExceptionHandler用于发生异常但未被捕获的情况。但是,那个线程会悄悄地失败吗?我想是的,因为它是异步进行业务的,但我正在调查我们的一个进程的相关问题,我很惊讶现

  • 在 C 中,当一个应该返回对象的函数在没有 return 语句的情况下结束时会发生什么?会得到什么回报? 例如。

  • 我的程序每次要处理某件事情时都会分叉,在每个分叉进程中,我都分离一个线程,以便从分叉进程中记录统计数据:这个线程循环收集数据,但它没有停止这个循环的实际条件。 程序的输出证实了每一个线程都随其工艺而死 当我使用运行这个程序时,引起了一些疑问:当每个分叉进程死亡时,会显示一些令人毛骨悚然的输出(13534是分叉进程PID): 相同的错误(警告?)每个分叉进程死亡时的消息。