c++ - 多线程独立任务

标签 c++ windows multithreading

我有 N 个任务,它们是独立的(即,在不同的内存地址写入),但完成时间并不完全相同(例如,从 2 到 10 秒)。我有 P 个线程。

我可以将 N 个任务划分为 P 个线程,然后启动我的线程。最终,最后,将剩下一个线程来完成最后几个任务,这不是最佳的。

我还可以启动 P 线程,每个线程有 1 个任务,WaitForMultipleObjects,并重新启动 P 线程等(这就是我目前所做的,因为创建线程的开销与任务相比很小)。但是,这也没有解决问题,在某个时刻仍然会有 P-1 线程等待最后一个。

有没有办法启动线程,并且一旦线程完成其任务,就继续执行下一个可用任务,直到所有任务完成?

谢谢!

最佳答案

是的,这就是所谓的线程池。这是一种非常常见的做法。

http://en.wikipedia.org/wiki/Thread_pool_pattern

基本上,您创建一个任务队列(带有参数的函数指针),并将任务推送到那里。您有 N 个正在运行的线程,它们执行以下循环(原理图代码):

while (bRunning) {
   task = m_pQueue.pop();
   if (task) {
      executeTask(task);
   }
   else {
    //you can sleep a bit here if you want
   } 
}

还有更优雅的方法来实现它(避免 sleep 等),但这就是它的要点。

关于c++ - 多线程独立任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9693478/

相关文章:

c++ - 如何从其上方定义的类中访问该类?

c++ - c++ 上的前向声明,里面有一个列表

windows - Windows 的同步文件系统命令

python - 在 Windows 上安装 dlib 时遇到一些问题

java - 使用 proc_open() 在 PHP 中运行 java 并获取输出

multithreading - Haskell中并发的奇怪行为

python - 如何等到所有线程完成工作?

c++ - C++ 字符串的 tolower 函数

java - 使用 Executor 和 WebSocket 的多线程

c++ - 如何关闭先前打开的 shell (C++)