Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 能否在短时间内有效地使用多线程_Multithreading_Winapi_Synchronization - Fatal编程技术网

Multithreading 能否在短时间内有效地使用多线程

Multithreading 能否在短时间内有效地使用多线程,multithreading,winapi,synchronization,Multithreading,Winapi,Synchronization,假设我有一个在主线程中执行某些操作的单线程代码,它大约需要10-20毫秒。我希望利用处理器的两个内核,并将任务拆分为两个位于不同内核的线程。从技术上讲,我可能应该恢复两个睡眠线程,让自己睡觉,直到它们完成,然后再睡觉。如果任务足够长,可以执行,那就没什么可怕的了。但是对于10-20毫秒,我怀疑使用著名的同步技术的惩罚会花费我大量的时间。如果我太多疑,并且Windows/CPU在使所有睡眠/唤醒请求有效方面做得很好,那么分割最短时间是什么,1ms、10ms、100ms 除非此短任务被多次调用(即在

假设我有一个在主线程中执行某些操作的单线程代码,它大约需要10-20毫秒。我希望利用处理器的两个内核,并将任务拆分为两个位于不同内核的线程。从技术上讲,我可能应该恢复两个睡眠线程,让自己睡觉,直到它们完成,然后再睡觉。如果任务足够长,可以执行,那就没什么可怕的了。但是对于10-20毫秒,我怀疑使用著名的同步技术的惩罚会花费我大量的时间。如果我太多疑,并且Windows/CPU在使所有睡眠/唤醒请求有效方面做得很好,那么分割最短时间是什么,1ms、10ms、100ms

除非此短任务被多次调用(即在循环中),否则没有意义,因为即使在考虑任何任务切换/线程启动/同步之前,您最多也可以节省10毫秒的处理时间

除非此短任务被多次调用(即在循环中),否则没有意义,因为即使在考虑任何任务切换/线程启动/同步之前,您最多也可以节省10毫秒的处理时间

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

用于唤醒线程并加入它们的特定同步调用非常小,远小于1ms

需要注意的一件事是引用的位置。如果在多个线程上运行的代码正在访问同一内存,那么CPU将必须同步内存访问,这可能会降低实际的性能改进

同样,如果线程正在使用公共资源,并且需要锁定或其他线程同步,那么等待这些锁定将降低性能


如果这些线程中存在任何I/O,那么将其拆分为线程将有助于最大限度地提高速度。

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

用于唤醒线程并加入它们的特定同步调用非常小,远小于1ms

需要注意的一件事是引用的位置。如果在多个线程上运行的代码正在访问同一内存,那么CPU将必须同步内存访问,这可能会降低实际的性能改进

同样,如果线程正在使用公共资源,并且需要锁定或其他线程同步,那么等待这些锁定将降低性能


如果这些线程中有任何I/O,则将其拆分为多个线程将有助于最大程度地提高速度。

如果您有许多任务,并且您的工作线程连续从公共队列中获取任务(如在ExecutorService中),则任务的开销为1..10微秒。Fork/Join功能甚至更有效。线程切换是最昂贵的操作,因此与其恢复2个休眠线程并让主线程等待,不如在主线程上运行一个任务,在工作线程上只运行一个任务。

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

如果代码编写良好,同步开销可能只有几毫秒。也就是说,有了两个内核和良好的可拆分任务,您的10毫秒将是,比方说,2毫秒同步费用+10/2毫秒计算成本。一点收获,但它已经在这里了。任务越大,好处就越多。您是否使用性能分析器来识别应用程序中的瓶颈?除非这是一个特定的瓶颈,否则我不会麻烦,尽管它会提高性能。为什么不试试呢?“典型的同步延迟是以纳秒为单位测量的,而不是以毫秒为单位。”塞缪尔·尼夫说。实际上,我考虑过这样的优化,看看在赛扬1.7Ghz和现代iCore上用了10毫秒的图形缩放原语的性能。但是后者有2个内核,并且逻辑可以很容易地垂直拆分,因此一个线程处理目标位图的(0..Height/2)和另一个-(Height/2+1..Height)。因此,如果代价很低,我应该看到这个函数的速度有所提高,编写良好的代码同步开销可能只有几毫秒。也就是说,有了两个内核和良好的可拆分任务,您的10毫秒将是,比方说,2毫秒同步费用+10/2毫秒计算成本。一点收获,但它已经在这里了。任务越大,好处就越多。您是否使用性能分析器来识别应用程序中的瓶颈?除非这是一个特定的瓶颈,否则我不会麻烦,尽管它会提高性能。为什么不试试呢?“典型的同步延迟是以纳秒为单位测量的,而不是以毫秒为单位。”塞缪尔·尼夫说。实际上,我考虑过这样的优化,看看在赛扬1.7Ghz和现代iCore上用了10毫秒的图形缩放原语的性能。但是后者有2个内核,并且逻辑可以很容易地垂直拆分,因此一个线程处理目标位图的(0..Height/2)和另一个-(Height/2+1..Height)。因此,如果惩罚较低,我应该看到该函数的速度有所提高。是的,由于对事件的多次响应,应该有多次调用。每个事件的响应时间是否小于40-50ms?如果没有,你应该能够找到一些其他的任务,它们将占用总时间的更高比例。实际上,它是你提到的多重事件和循环的混合体。如果两个事件之间的时间确实小于40-50毫秒,那么由于对事件的多次响应,应该有多次调用。每个事件的响应时间是否小于40-50毫秒?如果没有,你应该能够找到一些其他任务,将使用更高的比例