基本上我有一个Task和一个Thread类,我创建的线程数等于物理内核的数量(或逻辑内核,因为在Intel CPU内核上,它们的数量是计数的两倍)。
所以基本上线程从任务列表中获取任务并执行它们。但是,我必须确保一切都是安全的,多个线程不会尝试同时执行相同的任务,当然这会带来额外的开销(和头痛)。
我把任务功能放在线程中了吗?我的意思是 - 而不是4个线程从200个任务池中获取任务,为什么不是200个线程以4×4的组执行,基本上我不需要同步任何东西,没有锁定,没有任何东西。当然,我不会在整个运行期间创建线程,只是在初始化时。
这种方法有哪些优点和缺点?我可以解决的一个问题是 - 因为我只在初始化时创建线程,它们的计数是固定的,而对于任务,我可以继续在任务池中转储更多任务。 / p>
答案 0 :(得分:1)
线程有成本 - 每个线程都需要TLS空间和堆栈空间。
答案 1 :(得分:0)
从长远来看,保持你的Task和Thread类是分开的,这将是一种更清晰,更易于管理的方法,并且允许你限制在任何给定时间创建和运行的线程数量来保持开销(同样,任务很可能)占用比线程更少的内存,并在需要时更快地创建和释放。任务是控制完成任务的内容。线程是在运行任务时控制的。是的,您需要将Task对象存储在线程安全列表中,但使用关键部分,互斥锁,信号量等实现起来非常简单。在Windows上,您可以选择使用I / O完成端口将任务提交给线程,让操作系统为您处理同步和调度。
答案 2 :(得分:0)
一次运行200个线程肯定比运行4个线程运行200个“任务”需要更长的时间。您可以通过一个简单的程序对其进行测试,该程序可以进行一些简单的数学计算(例如,计算第一个20000000素数,通过要求每个线程一次执行100000个数字,然后抓取下一个数字,或者制作200个线程,每个数字包含100000个数字)。
慢多少?不知道,取决于很多东西。