线程同步:信号量与互斥锁的使用
1. 线程执行原理
在多线程编程中,线程之间可以通过设置 run_now 变量来告知对方运行,然后等待对方改变该变量的值后再继续执行。这体现了两个线程之间的执行会自动切换,同时也表明两个线程共享 run_now 变量。
2. 线程同步的必要性
在之前的线程执行中,线程之间的切换方法笨拙且效率低下。不过,有专门设计的一组函数可以更好地控制线程的执行以及访问代码的关键部分。常见的线程同步方法有两种:
- 信号量(Semaphores) :作为代码片段的“守门人”。
- 互斥锁(Mutexes) :作为互斥设备,用于保护代码部分。
这两种方法有相似之处,甚至可以用其中一种实现另一种。但在某些情况下,问题的语义表明其中一种更具表现力。例如,控制对一次只能由一个线程访问的共享内存的访问,最自然的方式是使用互斥锁;而控制对一组相同对象的整体访问,如从一组五条可用电话线中为一个线程分配一条电话线,则更适合使用计数信号量。选择哪种方法取决于个人偏好和程序的最合适机制。
3. 信号量同步
3.1 信号量概述
信号量是一种特殊类型的变量,可以进行递增或递减操作,并且对该变量的关键访问保证是原子性的,即使在多线程程序中也是如此。这意味着如果程序中的两个(或更多)线程试图更改信号量的值,系统保证所有操作实际上将按顺序进行。而对于普通变量,同一程序中不同线程的冲突操作结果是不确定的。
信号量分为两种:
超级会员免费看
订阅专栏 解锁全文
1101

被折叠的 条评论
为什么被折叠?



