因为又要做操作系统作业了,然而上次的作业还是心有余悸。这次的作业是关于同步和互斥的,本来上课的时候听的还不错,结果一看题目又看不懂了。同步和互斥是啥?信号量?锁?条件变量?管程?有啥区别啊,不就是为了互斥么!!!咸鱼加油!!
#### 多线程:
因为一个进程内部如果所有的代码串行执行的话,一个进程的阻塞会使别的进程也无法运行。所以希望将进程中“可以同步的部分”分成多个小块分别运行,所有有了多线程的概念。
CPU在A线程阻塞(比如等待磁盘响应)的时候,可以调用B线程进行计算。
线程之间:
- 独享:自己的栈(由esp和eip确定的一块具体地址空间),自己的寄存器-
- 共享:.data(存放全局变量), .text(存放代码)、堆
#### 为什么要同步与互斥:
由于每个线程都不是原子性的,A执行的过程中会被打断;而由于中断的时候只保存独有的寄存器和栈空间,所以共享的(如全局变量)会被修改,再次启动A线程的时候就会被改变。所以:
- 同步:希望先执行A线程,再做别的事情
- 互斥:希望A进程做事情的时候,共享的变量不被别人修改(因为多线程并行操作共享变量不受保护)
3、加锁:
加锁之后,线程A就算中途有不使用CPU的时候,也不会有别的线程访问这个共享变量,像如下代码:
参考自:https://www.cnblogs.com/cs-jin-note/archive/2012/10/30/2746468.html
```
#include
<stdio.h>
#include
<unistd.h>
#include
<pthread.h>
int a =
200;
int b =
100;
pthread_mutex_t
lock;
void*
ThreadA(void*)
{
pthread_mutex_lock(&lock);
//锁
a -= 50;
sleep(5);
//执行到一半 使用sleep 放弃cpu调度
b += 50;
pthread_mutex_unlock(&lock);
}
void*
ThreadB(void*)
{
sleep(1);
//放弃CPU调度
目的先让A线程运行。
pthread_mutex_lock(&lock);
printf("%d\n",
a + b);
pthread_mutex_unlock(&lock);
}
int main()
{
pthread_t
tida, tidb;
pthread_mutex_init(&lock,
NULL);
pthread_create(&tida,
NULL, ThreadA, NULL);
pthread_create(&tidb,
NULL, ThreadB, NULL);
pthread_join(tida,
NULL);
pthread_join(tidb,
NULL);
return 1;
}
```
不加锁的时候输出为250,因为中间有sleep,CPU会让调度B来运行;
加锁之后输出为300,因为在A解锁之后,B才能运行
网友评论