gpt4 book ai didi

c++ - 仅当前一个线程完成时才创建一个新线程

转载 作者:行者123 更新时间:2023-11-28 02:47:44 26 4
gpt4 key购买 nike

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

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

最佳答案

使用您发布请求的队列。

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

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

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

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

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

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

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


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

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) 你有一个请求类:

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 个请求将被添加到两个队列中,每当一个线程完成处理前一个请求时,它就会从队列中取出。

关于c++ - 仅当前一个线程完成时才创建一个新线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23868201/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com