Multithreading 术语问题:互斥锁、自旋锁、休眠锁
在StackOverflow和整个网络中,我看到人们区分互斥锁和自旋锁,就像互斥锁一样,互斥锁提供了Multithreading 术语问题:互斥锁、自旋锁、休眠锁,multithreading,concurrency,operating-system,mutex,spinlock,Multithreading,Concurrency,Operating System,Mutex,Spinlock,在StackOverflow和整个网络中,我看到人们区分互斥锁和自旋锁,就像互斥锁一样,互斥锁提供了acquire()和release()函数,如果锁被占用,那么acquire()将允许进程被抢占 然而,A.Silberschatz在其操作系统概念中在第6.5节中指出: 。。。这些工具中最简单的是互斥锁。(事实上,互斥是互斥的缩写。)我们使用互斥锁来保护关键部分,从而防止竞争条件。也就是说,一个进程必须在进入临界段之前获得锁;它在退出临界段时释放锁。acquire()函数获取锁,release(
acquire()
和release()
函数,如果锁被占用,那么acquire()
将允许进程被抢占
然而,A.Silberschatz在其操作系统概念中在第6.5节中指出:
。。。这些工具中最简单的是互斥锁。(事实上,互斥是互斥的缩写。)我们使用互斥锁来保护关键部分,从而防止竞争条件。也就是说,一个进程必须在进入临界段之前获得锁;它在退出临界段时释放锁。acquire()函数获取锁,release()函数释放锁
然后,他描述了一个旋转锁,虽然稍后会添加
我们描述的互斥锁类型也称为自旋锁,因为进程在等待锁可用时会“自旋”
因此,自旋锁只是一种互斥锁,而不是允许进程被抢占的可休眠锁。也就是说,自旋锁和休眠锁都是互斥锁:通过acquire()
和release()
函数进行锁定
我认为以Silberschatz的方式定义互斥锁是完全合乎逻辑的(尽管有点含蓄)
你同意什么方法
我们描述的互斥锁类型也称为自旋锁,因为进程在等待锁可用时会“自旋”
也许你误读了这本书(也就是说,“我们一直在描述的互斥锁类型”可能没有提到你认为它所指的确切段落),或者这本书已经过时了。现代术语很清楚互斥是什么,但自旋锁有点混乱
- 互斥体是一种并发原语,允许一个代理一次访问其资源,而其他代理必须在此期间等待,直到释放独占访问。它们等待的方式没有指定,也不相关,它们的进程可能会进入睡眠状态、写入磁盘、在循环中旋转,或者您可能正在使用协作并发(也称为“异步编程”)并将控制传递给事件循环作为“等待操作”
- 自旋锁没有明确的定义。它可以用来指:
- 互斥的同义词(我认为这是错误的,但它确实发生了)
- 始终在忙循环中等待的特定互斥实现
- 任何一种等待资源的忙等待循环。例如,信号量也可以使用“自旋锁”实现
我会考虑使用这个词来指一个并发的原语的一个特定实现,它在一个繁忙的循环中等待是正确的,如果一个更一般的术语是不合适的。也就是说,除非您特别想讨论繁忙等待的并发原语,否则请使用互斥(或任何您想要的原语)
- 互斥体是一种并发原语,允许一个代理一次访问其资源,而其他代理必须在此期间等待,直到释放独占访问。它们等待的方式没有指定,也不相关,它们的进程可能会进入睡眠状态、写入磁盘、在循环中旋转,或者您可能正在使用协作并发(也称为“异步编程”)并将控制传递给事件循环作为“等待操作”
- 自旋锁没有明确的定义。它可以用来指:
- 互斥的同义词(我认为这是错误的,但它确实发生了)
- 始终在忙循环中等待的特定互斥实现
- 任何一种等待资源的忙等待循环。例如,信号量也可以使用“自旋锁”实现
我会考虑使用这个词来指一个并发的原语的一个特定实现,它在一个繁忙的循环中等待是正确的,如果一个更一般的术语是不合适的。也就是说,除非您特别想讨论繁忙等待的并发原语,否则请使用互斥(或任何您想要的原语)
- 自旋锁是一种锁/互斥锁,其实现主要依赖于自旋循环
更高级的锁/互斥锁在其实现中可能有旋转部分,但是这些旋转部分的持续时间通常不超过几微秒左右。旋转锁是一种锁/互斥锁,其实现主要依赖于旋转循环
更高级的锁/互斥锁在其实现中可能有旋转部件,但这些部件的持续时间通常不超过几微秒左右。一位作者在一本书或一本手册中使用的词语在每本书和每本手册中并不总是具有相同的确切含义。这些词的含义会随着时间的推移而变化,当这些词成为新思想的名称时,这种变化会很快发生 不是每本书都是同时写的。并非每一位作家都是同一年龄或有相同的老师。这只是你必须习惯的事情 不久前,“互斥”是一个新想法的名字。 在一本书中,它可能只意味着防止两个或多个线程同时进入同一关键部分。在另一本书中,它可能是指某个操作系统或库中用于相同目的的特定类型的对象。上面的单词