c++ - 哪种方法可以在不阻塞主线程的情况下并行处理多个作业

标签 c++ multithreading timer

我有一个要求,其中单个进程应并行处理多个作业。这些作业中的每一个都应该定期运行(例如,每 10 秒)。此外,主线程需要监视停止信号,当收到信号时应停止所有线程并退出。

以下是我处理此要求的方法。

主线程会为每个作业创建线程并等待停止信号。每个线程负责处理循环机制。当主线程接收到停止信号时,它会向线程发送停止信号。

在此机制中,踏板将一直运行。所以我在想可能有更好的方法来处理这个问题。 也许像,主线程将跟踪下一个作业何时应该执行,并在需要时启动线程。线程将执行一些操作并在完成时退出。在这种情况下,线程不会一直运行。

我目前不知道如何实现替代方法。所以,我想知道以上哪一个可能是好的方法?另外,如果还有其他更好的选择,请提出建议。

编辑 [3 月 19 日]:

也许我应该在一开始就提到这一点,但这里是。

假设我有 2 个作业,两者不需要同时运行。例如,作业 1 应每 10 秒运行一次,作业 2 应每 20 秒运行一次。

此外,如果 Job 本身需要更多时间,则必须有某种机制来正确识别和处理它。也许跳过执行或等待上一个作业完成然后重新开始。目前,这方面的要求并不明确。但是,我应该能够识别和处理这种情况。

最佳答案

这里有一些建议。

首先让主线程启动线程以根据需要完成任务。主线程在创建线程时将其分离,然后完全忘记它。分离的线程在返回时会自行清理。这可以轻松简化主线程,还可以消除跟踪和管理不同线程的开销。如果线程几乎完全独立并且永远不会遇到无限循环,则此方法有效。主线程将在收到停止信号时退出,这又会终止进程,但这取决于操作系统,因此请查看 What happens to a detached thread when main() exits? .

您启动一个线程作为任务/线程管理器。此对象/线程将根据需要创建新线程,并通过某些池或线程跟踪正确地等待它们。然后主线程可以很容易地通过互斥保护标志通知线程跟踪器停止,在这种情况下,线程跟踪器只是等待所有它生成的线程然后死掉。这需要比上述解决方案更多的开销,但它为您提供了有关哪些线程何时运行的更多信息。此外,您还可以更好地控制是否需要直接终止线程或在必要时如何向线程发送消息。它还允许安全清理,这取决于您的操作系统,线程可能会因进程死亡而缩短。如果线程需要能够更轻松地接收消息,并且如果您希望确保线程即使在停止信号之后仍能运行完成(想想 R/W 操作),这会更好。

您也可以将主线程和线程/管理器混合为一个,但这会使主线程更加复杂,并且不会显着减少大多数通用场景的开销。

关于c++ - 哪种方法可以在不阻塞主线程的情况下并行处理多个作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49890331/

相关文章:

c++ - 如何将json文件读入C++字符串

java - 我是否应该创建虚拟对象以便能够同步可能为空的属性?

c++ - 如何使用 C++ 11 使函数在所需的时间段执行

php - 如何在 PHP 中设置阻塞等待信号的进程

linux - 如何让 tickless 内核工作? nohz_full、rcu_nocbs、isolcpus 还有什么?

C++类中的C++过期机制

c++ - `*--p` 在 C++03 中实际上是否合法(格式正确)

c++ - 为什么 ofstream 有时会创建文件但无法写入文件?

java - 在 volatile 变量写入后写入的变量的可见性

android - 如何让 android 程序显示布局,然后等待几秒钟。并显示另一种布局?