互斥
互斥,指的是某一个资源同时只允许一个访问者对其进行访问,具有唯一排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。当一个进程处于临界区并访问共享资源时,没有其他进程会处于临界区并访问任何相同的共享资源。互斥锁是一种基本的同步机制,用于保护共享资源不被多个线程同时访问。
同步
同步,是指在互斥的基础上(大多数情况下),通过其它机制实现访问者对资源的有序访问。大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。同步体现的是一种协作性,而互斥体现的是排它性。一般来说,同步关系中往往包含互斥,同时对临界区的资源会按照某种逻辑顺序进行访问。
锁
锁是用于实现同步与互斥的一种机制,它确保同一时间只有一个线程或进程可以访问特定的共享资源或执行特定的代码段。以下是几种常见的锁:
互斥锁:最基本的同步机制之一,用于保护共享资源不被多个线程同时访问。当线程需要访问共享资源时,会先尝试获取互斥锁。如果锁已被其他线程持有,则当前线程会被阻塞,直到锁被释放。
自旋锁:一种轻量级的同步机制,适用于锁持有时间短且线程不希望在等待锁时被阻塞的场景。与互斥锁不同,自旋锁不会使线程进入等待状态,而是让线程在当前位置不断循环检查锁的状态,直到成功获取锁。自旋锁通常比互斥锁具有更低的开销,因为它避免了线程切换和上下文切换的开销。但是,如果锁的持有时间长,自旋锁可能导致CPU资源的浪费。
读写锁:允许多个读者同时访问资源以提高读取的性能,但写操作是互斥的。当使用读锁时,允许多个读的线程进入,不允许写操作线程进入;当有线程希望写时,必须阻塞,直到所有线程释放锁。写锁则不允许其他读写操作进行。
信号量:一个整数变量,用于控制对共享资源的访问。它支持等待(P操作)和信号(V操作)两种操作。信号量可以用来解决各种同步问题,如限制资源的使用量、实现互斥和条件同步等。