0

基本上我有一个 Task 和一个 Thread 类,我创建的线程数量等于物理内核(或逻辑内核,因为在 Intel CPU 内核上它们是计数的两倍)。

所以基本上线程从任务列表中获取任务并执行它们。但是,我必须确保一切都是安全的,并且多个线程不要尝试一次执行相同的任务,当然这会带来额外的开销(和头痛) .

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

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

4

3 回答 3

1

线程是有代价的——每个线程至少需要空间用于 TLS 和堆栈。

于 2013-01-31T23:59:13.970 回答
0

从长远来看,将 Task 和 Thread 类分开将是一种更清洁、更易于管理的方法,并且通过允许您限制在任何给定时间创建和运行的线程数(此外,一个 Task 可能占用比线程更少的内存,并且在需要时可以更快地创建和释放)。任务是控制完成的内容。线程控制任务何时运行。是的,您需要将任务对象存储在线程安全列表中,但是使用临界区、互斥锁、信号量等非常容易实现。特别是在 Windows 上,您也可以使用 I/O 完成端口代替将任务提交给线程,让操作系统为您处理同步和调度。

于 2013-02-01T00:03:44.230 回答
0

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

慢多少?不知道,取决于很多事情。

于 2013-02-01T00:05:37.010 回答