是否可以在短时间内有效地使用多线程

时间:2012-08-30 12:34:42

标签: multithreading winapi synchronization

考虑我有一个单线程代码在主线程中执行某些操作,大约需要10-20毫秒。我想利用我的处理器的两个核心,并将任务拆分为生活在不同核心的两个线程。从技术上讲,我应该恢复两个睡眠线程,让自己睡觉,直到他们完成并再次入睡。如果任务足够长就可以执行,那就什么都不吓到了。但是对于10-20毫秒,我怀疑使用众所周知的同步技术的代价将花费我很大一部分时间。如果我太怀疑并且Windows / CPU能够很好地完成所有睡眠/唤醒请求,那么分割时,1ms,10ms,100ms的最小时间是多少?

3 个答案:

答案 0 :(得分:4)

使用现有线程池(现有休眠线程)的多线程可以加速10-20ms的操作。

唤醒线程并加入它们的特定同步调用是微不足道的,远小于1ms。

需要注意的一件事是参考地点。如果在多个线程上运行的代码访问相同的内存,则CPU必须同步内存访问,这可能会降低实际的性能提升。

同样,如果线程使用公共资源并需要锁定或其他线程同步,则等待这些锁会降低性能。

如果这些线程中有任何I / O,那么将其拆分为线程将有助于加快它的速度。

答案 1 :(得分:2)

除非这个简短的任务被多次调用(即在循环中),否则没有意义,因为在你考虑任何任务切换/线程启动/同步之前,你最多只能节省10ms的处理时间。 。

答案 2 :(得分:1)

如果您有许多任务并且您的工作线程不断地从公共队列中获取任务(例如在ExecutorService中),则任务的开销为1..10微秒。 Fork / Join设施更加有效。线程切换是最昂贵的操作,因此不是恢复2个休眠线程并使主线程等待,而是在主线程上运行一个任务,在工作线程上只运行一个任务。

相关问题