C++ 如果使用数百个线程';只创建一次?

C++ 如果使用数百个线程';只创建一次?,c++,multithreading,thread-safety,threadpool,C++,Multithreading,Thread Safety,Threadpool,基本上,我有一个任务和一个线程类,我创建的线程数量等于物理核(或逻辑核,因为在英特尔CPU核上,它们的数量是原来的两倍) 因此,线程基本上从任务列表中获取任务并执行它们。但是,我必须确保所有任务都是安全的,多个线程不会试图同时执行同一个任务,当然这会带来额外的开销(和麻烦) 我把任务功能放在线程中的是什么?我的意思是-不是4个线程从200个任务池中抓取任务,为什么不以4乘4的组执行200个线程,基本上我不需要同步任何东西,不需要锁定,什么都不需要。当然,我不会在整个运行时创建线程,只是在初始化时

基本上,我有一个任务和一个线程类,我创建的线程数量等于物理核(或逻辑核,因为在英特尔CPU核上,它们的数量是原来的两倍)

因此,线程基本上从任务列表中获取任务并执行它们。但是,我必须确保所有任务都是安全的,多个线程不会试图同时执行同一个任务,当然这会带来额外的开销(和麻烦)

我把任务功能放在线程中的是什么?我的意思是-不是4个线程从200个任务池中抓取任务,为什么不以4乘4的组执行200个线程,基本上我不需要同步任何东西,不需要锁定,什么都不需要。当然,我不会在整个运行时创建线程,只是在初始化时


这样的方法有什么优点和缺点?我可以忽略的一个问题是-因为我只在初始化时创建线程,它们的计数是固定的,使用任务时,我可以继续在任务池中转储更多任务。

线程是有成本的-每个线程至少需要一个TLS和一个堆栈的空间。

从长远来看,将任务和线程类分开将是一种更干净、更易于管理的方法,通过允许您限制在任何给定时间创建和运行的线程数量来降低开销(同时,任务可能比线程占用更少的内存,并且在需要时创建和释放的速度更快)。任务是控制完成什么的东西。线程控制任务何时运行。是的,您需要将任务对象存储在线程安全列表中,但使用关键部分、互斥、信号量等实现起来非常简单。具体来说,在Windows上,您也可以使用I/O完成端口将任务提交给线程,让操作系统为您处理同步和调度。

一次运行200个线程肯定比运行4个线程来运行200个“任务”需要更长的时间。您可以通过一个简单的程序来测试这一点,该程序会做一些简单的数学运算(例如,计算第一个20000000素数,让每个线程一次做100000个数字,然后抓取下一批,或者制作200个线程,每个线程有100000个数字)


慢了多少?不知道,取决于这么多事情

你怎么会只有四个线程在运行?您肯定需要以某种方式同步此操作吗?看起来您在跟踪生产者-消费者队列。以下是一些好的读物: