多线程同步:信号量与互斥锁的使用
1. 线程执行原理
在多线程编程中,线程之间的执行协调至关重要。每个线程通过设置 run_now 变量来通知另一个线程运行,然后等待另一个线程改变该变量的值后再继续执行。这表明执行权会在两个线程之间自动传递,同时也说明了两个线程共享 run_now 变量。
2. 同步的必要性
之前,我们看到两个线程可以同时执行,但它们之间的切换方法笨拙且效率低下。幸运的是,有一组专门设计的函数可以提供更好的方式来控制线程的执行和访问关键代码段。
3. 同步方法概述
主要有两种基本的同步方法:
- 信号量(Semaphores) :作为代码段的守门人。
- 互斥锁(Mutexes) :作为互斥设备,用于保护代码段。
这两种方法相似,甚至可以用一种方法实现另一种方法。但在某些情况下,问题的语义表明其中一种方法比另一种更具表现力。例如,控制对共享内存的访问,一次只允许一个线程访问,最自然的做法是使用互斥锁;而控制对一组相同对象的整体访问,如从一组五条可用电话线中为一个线程分配一条电话线,则更适合使用计数信号量。选择哪种方法取决于个人偏好和程序的最合适机制。
4. 信号量同步
信号量有两组接口函数:一组来自 POSIX 实时扩展,用于线程;另一组是 System V 信号量,常用于进程同步。这两组函数不保证可互换,虽然非常相似,但使用不同的函数调用。
信号量是由荷兰计算机科学家 Dijk
超级会员免费看
订阅专栏 解锁全文
1103

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



