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
Multithreading 线程计数=硬件并行时的互斥锁与自旋锁_Multithreading_Synchronization_Mutex_Spinlock - Fatal编程技术网

Multithreading 线程计数=硬件并行时的互斥锁与自旋锁

Multithreading 线程计数=硬件并行时的互斥锁与自旋锁,multithreading,synchronization,mutex,spinlock,Multithreading,Synchronization,Mutex,Spinlock,考虑在专用服务器上运行具有最佳线程数的程序,这样,如果一个线程被锁定,就不会有其他线程(几乎)等待CPU时间。在这种情况下,自旋锁是否在所有可能的情况下都比互斥锁提供更好的性能 [编辑]一些解释:由于线程之间没有CPU时间争用,线程可以使用自旋锁,而不影响其他线程的性能。而且自旋锁不会切换到足够重的等待模式(至少在windows上,idk它在linux上的表现)我认为自旋锁在这种情况下会工作得更好,除非您试图优化代码,并且它取决于不同的I/O时间等,否则实际上不需要互斥锁。。。关于等待模式,您也

考虑在专用服务器上运行具有最佳线程数的程序,这样,如果一个线程被锁定,就不会有其他线程(几乎)等待CPU时间。在这种情况下,自旋锁是否在所有可能的情况下都比互斥锁提供更好的性能


[编辑]一些解释:由于线程之间没有CPU时间争用,线程可以使用自旋锁,而不影响其他线程的性能。而且自旋锁不会切换到足够重的等待模式(至少在windows上,idk它在linux上的表现)

我认为自旋锁在这种情况下会工作得更好,除非您试图优化代码,并且它取决于不同的I/O时间等,否则实际上不需要互斥锁。。。关于等待模式,您也提出了一个很好的观点。

我认为spinlock在这种情况下会工作得更好,除非您试图优化代码,并且它取决于不同的I/O时间等,否则实际上并不需要互斥锁。。。关于等待模式,您也提出了一个很好的观点。

您的前提不太现实。也许您的进程具有最佳的线程数,而操作系统的其余部分则具有数百个其他线程。其中一些可能已经准备好运行了,当您的线程出现问题时,它们会很高兴地获得一个CPU内核。此外,如果该线程即将被阻塞,则很可能会发生这种情况,因为进程中的另一个线程持有锁。这可能会在旋转等待时间释放它。线程数与此无关。因此,旋转等待仍然有意义。

您的前提不太现实。也许您的进程具有最佳的线程数,而操作系统的其余部分则具有数百个其他线程。其中一些可能已经准备好运行了,当您的线程出现问题时,它们会很高兴地获得一个CPU内核。此外,如果该线程即将被阻塞,则很可能会发生这种情况,因为进程中的另一个线程持有锁。这可能会在旋转等待时间释放它。线程数与此无关。因此,旋转等待仍然是有意义的。

旋转锁可能更为优化,因为没有到内核的转换。但是这个场景是如此的做作,我建议永远不要尝试将它应用到现实生活中的代码中。

自旋锁可能会更为理想,因为没有到内核的转换。但是这个场景太过做作,我建议永远不要尝试将它应用到现实生活中的代码中。

你能解释一下为什么在这种情况下你认为spinlock比mutex好吗?你能解释一下为什么在这种情况下你认为spinlock比mutex好吗?
除非你试图优化你的代码,并且这取决于I/O etc的不同时间
-你是指描述的环境还是一般情况?我会说一般情况,但在某些情况下,旋转锁可能会做得更好,甚至更好。
除非你试图优化你的代码,它取决于I/O etc的不同时间
-你是指描述的环境还是总的来说?我会说总的来说,但是在某些情况下,自旋锁可能会做得更好,甚至更好。哦,让我们来拆分一下:1)系统线程有时会唤醒,但它不会经常发生,并且会对尝试利用100%核的程序产生重大影响。2) 不确定我是否正确理解了最后一部分:你的意思是自旋等待会在另一个线程解锁资源时做出更糟糕的反应吗?你能详细说明一下整个想法吗?一个旋转等待可以燃烧几百个循环,这对于避免燃烧上下文切换所需的数千个循环是很有用的。你需要考虑,什么会使你的线程阻塞?除了由操作系统处理的正常I/O完成等待之外,它可以阻止的唯一锁是您的锁。旋转等待它们是有意义的,不管你有多少线程。哦,让我们来拆分一下:1)系统线程有时会唤醒,但这不会经常发生,并且会对试图利用100%内核的程序产生重大影响。2) 不确定我是否正确理解了最后一部分:你的意思是自旋等待会在另一个线程解锁资源时做出更糟糕的反应吗?你能详细说明一下整个想法吗?一个旋转等待可以燃烧几百个循环,这对于避免燃烧上下文切换所需的数千个循环是很有用的。你需要考虑,什么会使你的线程阻塞?除了由操作系统处理的正常I/O完成等待之外,它可以阻止的唯一锁是您的锁。无论你有多少线程,旋转等待它们都是有意义的。事实上,它不是那么做作的:web服务器、邮件服务器、媒体流服务器、游戏服务器等等。这些都不能保证在这种情况下。要使用反参数,在有另一个线程等待该CPU的情况下,互斥锁几乎总是更理想的(除非等待时间非常短)。自旋锁将消耗CPU并倾向于拒绝后台线程。这种情况远比你在OP中描述的情况更为可能。事实上,它并不是那么做作:web服务器、邮件服务器、媒体流服务器、游戏服务器等等。这些都不能保证会出现这种情况。要使用反参数,在有另一个线程等待该CPU的情况下,互斥锁几乎总是更理想的(除非等待时间非常短)。自旋锁将消耗CPU并倾向于拒绝后台线程。这种情况远比你在作品中描述的更可能发生。