只在前一个线程完成时创建一个新线程
Create a new thread only when a previous one finished
我正在一个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是受互斥锁保护的
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 当我在其中一个线程执行中(在activemq-cpp中)捕获到特定值时,我如何终止/停止所有其他线程
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 在另一个线程中调用luaL_error会引发qWarning
- 全局变量 多读取器 一个写入器多线程安全?
- C++一个线程如何正确通信其任务已完成?
- 最佳做法是从另一个线程访问 qml 中的Q_PROPERTY
- C++线程:如何在一个线程仍在运行时阻止另一个线程执行 (Win32)
- 是否可以创建一个从不同类调用函数的线程?
- 如何制作一个只能在一个线程上同时执行的函数?
- 结束另一个线程中使用的对象的生存期
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 一个线程等待多个线程事件
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- C 两个线程一个用于输入,一个用于输出
- 2个线程 - 一个带有OpenGL窗口的线程,第二个带有WXWIDGETS的窗口
- 每个线程一个类实例,C++11
- 多线程-一个作家和一个读者-我们需要使用储物柜吗
- Cuda如何从全局函数运行多个线程?一个运行多个线程的内核