多线程可以和事件编程结合起来吗?

标签 c multithreading

我有一个使用事件驱动编程实现的单线程 C 程序 - 每次事件发生时都会触发回调。

回调执行的时间太长(做一堆计算),这个处理时间很重要。目前是 500 微秒,需要小于 100。

大部分计算是独立的,可以并行完成。

我有一台有很多内核的机器,我在想是否可以使用多个线程来并行计算/有帮助。

我认为在回调开始时生成多个线程,然后将不同的计算发送到多个线程的方法效果不佳,因为生成线程需要时间。

是否可以启动几个线程等待使用,并且每次触发回调时我都可以将计算发送到那里,而不必在每个回调中生成线程?

最佳答案

您可以为此使用线程池(通常称为工作池)。基本思想是预先创建一定数量的线程并让它们全部休眠,在没有工作要做时等待信号量。

如果您可以为每个处理任务分配一个线程,那么您的代码会更简单,但您也可以(小心地)使用一个队列来实现它,其中每个工作人员都尝试处理队列中的下一个作业,然后在空闲时休眠作业队列为空。

无论哪种方式,单轮处理都将如下所示:

  1. 将任务分配或排队到您的工作人员池
  2. 通知工作池唤醒并开始处理任务
  3. 等待工作池发出所有任务完成的信号 (*)

(*) 请记住,“所有任务完成”与“任务队列为空”不同

现在,您的主要时序瓶颈将取决于互斥锁/信号量实现和操作系统线程调度程序。为所有工作线程设置高优先级可能是合适的。

如果您有固定时间间隔的事件,对上述事件的一个常见改进是也使用双缓冲(即输出前一个事件的结果,并分配工作人员开始处理当前事件的输入)。为此,您需要将第 3 步移到第 1 步之前。

这可能适合也可能不适合您的目的。但它可以提供一些额外的时间余地,如果你仍然无法足够快地处理。先尝试一些简单的东西。当您开始引入额外要求时,这样的问题会很快变得棘手。

关于多线程可以和事件编程结合起来吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42504060/

相关文章:

java - SwingWorker线程即使任务完成也没有关闭?

android - Android 中的线程阻塞 UI

无法使用 Arduino Wifi-Shield 连接到本地服务器

c - 函数中结构数组的处理成员

c - 为什么目标文件的顺序对静态库很重要?

windows - 栈和栈基地址

并发线程和数据竞争

c - 在目录中循环并在 c 中获取其文件

C:为什么指针周围有括号?

java - 静态变量与 volatile 变量