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

时间:2014-05-26 10:35:37

标签: c++ multithreading

我正在研究一个拥有4个核心的系统。我的代码可以分成几个部分,每个部分独立工作,但需要大量的内存。

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

2 个答案:

答案 0 :(得分:2)

使用您发布请求的队列。

每个请求对象都有一个封装要做的工作的执行方法。

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

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

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

  • 实施条件/信号机制(在发布新请求时会锁定等待,直到它收到信号)。
  • 简单地睡了一会儿

...无论如何不要在循环中盲目旋转

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


编辑:一些伪代码有助于理解。

a)初始化。

spawn 4 threads (all running mainThread())

b)在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个请求将被添加到两个队列中。

答案 1 :(得分:0)

让主线程仅在计数小于4时才创建线程。每当线程关闭时,此计数可以递减,如果新线程被跨越,则计数可以递增。确保计数是互斥保护。