只在前一个线程完成时创建一个新线程

Create a new thread only when a previous one finished

本文关键字:线程 一个 新线程 创建 完成时      更新时间:2023-10-16

我正在一个4核的系统上工作。我的代码可以分成独立工作的部分,但这需要大量的内存。

是否有可能让我的系统等待一个线程完成之前创建一个新的,这样我只有4个线程同时运行,而仍然使用我所有的核心完全?

使用队列来发布请求。

每个请求对象都有一个execute方法,它封装了要做的工作。

在启动时启动(四个)线程。

线程在无限循环中运行(或者直到收到线程必须结束的指示),等待请求出现在队列中并执行它们。

等待可以通过以下方式完成:

  • 实现一个条件/信号机制(将锁定等待,直到它收到一个新的请求时发出的信号)。
  • 简单地睡一会儿

…在任何情况下都不要在循环中盲目旋转

你需要一些互斥锁来保护请求队列…因为它是所有线程共享的内存。


编辑:一些伪代码来帮助理解。

a)初始化。

spawn 4 threads (all running mainThread())

b) On mainThread()

while(main program is running)         
    poll queue // shared by all threads        
    retrieve first Request object from queue.
    invoke execute method of Request object
    sleep some time (10 ms) // or use a condition/signal
end loop

正如你所看到的,线程并不关心其他线程的状态,它只是去取一些任务,执行,然后返回更多的任务。

您要确保在任何时候同时运行的作业不超过4个,因为您只有4个线程。

c)你有一个Request类:
class Request {
public:
     virtual ~Request() { }
     virtual void execute() =0;
};

和一个或多个子类:

class ThingToDoOfType1: public Request {
public:
    void execute() {
       // whatever means the "thing to do of type 1"
    }
}

请求不关心其他请求的状态…如果他们需要担心……然后它会变得稍微困难一些。

d)最后,您需要在某个地方插入队列中不同类型的请求。可以插入....

  • 一气呵成。线程将一个接一个地选择,一次最多执行4个。
  • 根据用户请求或从网络接收

初始化的例子如下:

spawn 4 threads (all running maintThread())
Insert 1000 Requests of Type1, Type2 and Type 3.

1000个请求将被添加到队列中,每次线程完成处理前一个请求时,它将从队列中获取。

让主线程只在计数小于4时创建一个线程。每当线程关闭时,该计数可以减少,如果跨越了一个新线程,则可以增加计数。确保count是受互斥锁保护的