我听说过这些与并发编程有关的词,但是锁、互斥量和信号量之间有什么区别呢?
当前回答
关于这些词有很多误解。
这是之前的一篇文章(https://stackoverflow.com/a/24582076/3163691),非常适合这里:
1)临界区(Critical Section) =用户对象,用于允许在一个进程中执行多个活动线程中的一个活动线程。其他未被选中的线程(@获取该对象)将进入睡眠状态。
[没有进程间能力,非常基本的对象]。
2)互斥信号量(Mutex Semaphore,又名Mutex)=内核对象,用于允许在不同的进程中,只执行一个活动线程。其他未被选中的线程(@获取该对象)将进入睡眠状态。该对象支持线程所有权、线程终止通知、递归(同一个线程的多个“acquire”调用)和“优先级反转避免”。
[进程间能力,使用非常安全,一种'高级'同步对象]。
3)计数信号量(又名Semaphore)=内核对象,用于允许来自许多其他线程的一组活动线程的执行。其他未被选中的线程(@获取该对象)将进入睡眠状态。
[然而,进程间功能使用起来不太安全,因为它缺乏以下'互斥'属性:线程终止通知,递归?,“优先倒置规避”?等)。
4)现在,说到“自旋锁”,首先是一些定义:
关键区域(Critical Region):由两个或多个进程共享的内存区域。
Lock=其值允许或拒绝进入“关键区域”的变量。(它可以被实现为一个简单的“布尔标志”)。
忙碌等待=持续测试一个变量,直到某个值出现。
最后:
自旋锁(Spinlock)=一种使用忙等待的锁。(锁的获取是通过xchg或类似的原子操作完成的)。
没有线程睡眠,主要只在内核级使用。对于用户级别代码无效]。
作为最后的评论,我不确定,但我可以跟你打赌,上面的前3个同步对象(#1,#2和#3)使用这个简单的野兽(#4)作为它们实现的一部分。
祝你有愉快的一天!
引用:
-《嵌入式系统的实时概念》,作者:Qing Li和Caroline Yao (CMP Books)。
——安德鲁·塔南鲍姆(皮尔逊教育国际)的《现代操作系统》(第三期)。
-为微软Windows编程应用程序(第4)由Jeffrey Richter(微软编程系列)。
另外,你可以看看看看: https://stackoverflow.com/a/24586803/3163691
其他回答
看一看John Kopplin的多线程教程。
在线程间同步一节中,他解释了事件、锁、互斥量、信号量和可等待计时器之间的区别
A mutex can be owned by only one thread at a time, enabling threads to coordinate mutually exclusive access to a shared resource Critical section objects provide synchronization similar to that provided by mutex objects, except that critical section objects can be used only by the threads of a single process Another difference between a mutex and a critical section is that if the critical section object is currently owned by another thread, EnterCriticalSection() waits indefinitely for ownership whereas WaitForSingleObject(), which is used with a mutex, allows you to specify a timeout A semaphore maintains a count between zero and some maximum value, limiting the number of threads that are simultaneously accessing a shared resource.
维基百科有一个关于信号量和互斥量区别的很好的章节:
A mutex is essentially the same thing as a binary semaphore and sometimes uses the same basic implementation. The differences between them are: Mutexes have a concept of an owner, which is the process that locked the mutex. Only the process that locked the mutex can unlock it. In contrast, a semaphore has no concept of an owner. Any process can unlock a semaphore. Unlike semaphores, mutexes provide priority inversion safety. Since the mutex knows its current owner, it is possible to promote the priority of the owner whenever a higher-priority task starts waiting on the mutex. Mutexes also provide deletion safety, where the process holding the mutex cannot be accidentally deleted. Semaphores do not provide this.
关于这些词有很多误解。
这是之前的一篇文章(https://stackoverflow.com/a/24582076/3163691),非常适合这里:
1)临界区(Critical Section) =用户对象,用于允许在一个进程中执行多个活动线程中的一个活动线程。其他未被选中的线程(@获取该对象)将进入睡眠状态。
[没有进程间能力,非常基本的对象]。
2)互斥信号量(Mutex Semaphore,又名Mutex)=内核对象,用于允许在不同的进程中,只执行一个活动线程。其他未被选中的线程(@获取该对象)将进入睡眠状态。该对象支持线程所有权、线程终止通知、递归(同一个线程的多个“acquire”调用)和“优先级反转避免”。
[进程间能力,使用非常安全,一种'高级'同步对象]。
3)计数信号量(又名Semaphore)=内核对象,用于允许来自许多其他线程的一组活动线程的执行。其他未被选中的线程(@获取该对象)将进入睡眠状态。
[然而,进程间功能使用起来不太安全,因为它缺乏以下'互斥'属性:线程终止通知,递归?,“优先倒置规避”?等)。
4)现在,说到“自旋锁”,首先是一些定义:
关键区域(Critical Region):由两个或多个进程共享的内存区域。
Lock=其值允许或拒绝进入“关键区域”的变量。(它可以被实现为一个简单的“布尔标志”)。
忙碌等待=持续测试一个变量,直到某个值出现。
最后:
自旋锁(Spinlock)=一种使用忙等待的锁。(锁的获取是通过xchg或类似的原子操作完成的)。
没有线程睡眠,主要只在内核级使用。对于用户级别代码无效]。
作为最后的评论,我不确定,但我可以跟你打赌,上面的前3个同步对象(#1,#2和#3)使用这个简单的野兽(#4)作为它们实现的一部分。
祝你有愉快的一天!
引用:
-《嵌入式系统的实时概念》,作者:Qing Li和Caroline Yao (CMP Books)。
——安德鲁·塔南鲍姆(皮尔逊教育国际)的《现代操作系统》(第三期)。
-为微软Windows编程应用程序(第4)由Jeffrey Richter(微软编程系列)。
另外,你可以看看看看: https://stackoverflow.com/a/24586803/3163691
使用Linux变体上的C编程作为示例的基本情况。
锁:
•通常是一个非常简单的构造二进制在操作中锁定或解锁
•没有线程所有权、优先级、顺序等概念。
•通常是旋转锁,线程不断检查锁的可用性。
•通常依赖于原子操作,例如Test-and-set, compare-and-swap, fetch-and-add等。
•通常需要硬件支持原子操作。
文件锁:
•通常用于协调多个进程对文件的访问。
多个进程可以持有读锁,但是当任何一个进程持有写锁时,不允许其他进程获得读或写锁。
•示例:flock, fcntl等。
互斥:
互斥锁函数调用通常在内核空间中工作,并导致系统调用。
•它使用了所有权的概念。只有当前持有互斥锁的线程才能解锁它。
互斥不是递归的(异常:PTHREAD_MUTEX_RECURSIVE)。
•通常用于与条件变量关联,并作为参数传递给例如pthread_cond_signal, pthread_cond_wait等。
•一些UNIX系统允许多个进程使用互斥锁,尽管这可能不是在所有系统上强制执行。
信号量:
•这是一个内核维护的整数,其值不允许低于零。
•可用于同步进程。
信号量的值可以设置为大于1的值,在这种情况下,该值通常表示可用资源的数量。
•值限制为1和0的信号量称为二进制信号量。
锁只允许一个线程进入被锁的部分,并且锁不与任何其他进程共享。
互斥锁与锁相同,但它可以是系统范围的(由多个进程共享)。
信号量的作用与互斥量相同,但允许x个线程进入,这可以用于限制同时运行的cpu、io或ram密集型任务的数量。
关于互斥量和信号量区别的更详细的文章请阅读这里。
您还可以使用读/写锁,在任何给定时间允许无限数量的读取器或1个写入器。
这些描述是从。net的角度出发的,对于所有操作系统/语言可能不是100%准确。
推荐文章
- Thread start()和Runnable run()有什么区别
- 在Swift中,什么相当于Objective-C的“@synchronized”?
- 是AsyncTask真的概念上有缺陷或我只是错过了一些东西?
- 信号量和监视器——有什么不同?
- AtomicInteger的实际用途
- 什么是协程?
- Std::lock_guard或Std::scoped_lock?
- Java中的Volatile vs Static
- 当Node.js内部仍然依赖线程时,它是如何固有地更快的?
- Volatile boolean vs AtomicBoolean
- 什么时候我需要在Java中使用AtomicBoolean ?
- ruby有真正的多线程吗?
- 为什么wait()必须总是在同步块中
- 并发、并行和异步方法之间的区别是什么?
- “Java并发实践”仍然有效吗?