我正在研究一个拥有4个核心的系统。我的代码可以分成几个部分,每个部分独立工作,但需要大量的内存。
是否有可能让我的系统在创建新线程之前等待线程完成,这样我只有4个线程同时运行,同时仍然完全使用我的所有内核?
答案 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)最后,您需要在某处插入队列中不同类型的请求。 它们可以插入......
一个例子可能是在初始化中:
spawn 4 threads (all running maintThread())
Insert 1000 Requests of Type1, Type2 and Type 3.
每次线程完成处理上一个请求时,1000个请求将被添加到两个队列中。
答案 1 :(得分:0)
让主线程仅在计数小于4时才创建线程。每当线程关闭时,此计数可以递减,如果新线程被跨越,则计数可以递增。确保计数是互斥保护。