一、同步与互斥的区别
1. 同步
同步,又称直接制约关系,是指多个线程(或进程)为了合作完成任务,必须严格按照规定的 某种先后次序来运行。
例如,线程 T2 中的语句 y 要使用线程 T1 中的语句 x 的运行结果,所以只有当语句 x 执行完成之后语句 y 才可以执行。我们可以使用信号量进行同步:
semaphore S=0; // 初始化信号量
T1() {
...
x; // 语句x
V(S); // 告诉线程T2,语句x已经完成
...
}
T2() {
...
P(S); // 检查语句x是否运行完成
y; // 检查无误,运行y语句
...
}
2. 互斥
互斥,又称间接制约关系,是指系统中的某些共享资源,一次只允许一个线程访问。当一个线程正在访问该临界资源时,其它线程必须等待。
例如,打印机就是一种临界资源,而访问打印机的代码片段称为临界区,故每次只允许一个线程进入临界区。—— 我们同样可以使用信号量解决互斥问题,只需把临界区置于 P(S) 和 V(S) 之间,即可实现两线程对临界资源的互斥访问。
semaphore S=1; // 初始化信号量
T1() {
...
P(S);
线程T1的临界区; // 访问临界资源
V(S);
...
}
T2() {
...
P(S);
线程T2的临界区; // 访问临界资源
V(S);
...
}