对同步与互斥的深入理解

因为又要做操作系统作业了,然而上次的作业还是心有余悸。这次的作业是关于同步和互斥的,本来上课的时候听的还不错,结果一看题目又看不懂了。同步和互斥是啥?信号量?锁?条件变量?管程?有啥区别啊,不就是为了互斥么!!!咸鱼加油!!

#### 多线程:

因为一个进程内部如果所有的代码串行执行的话,一个进程的阻塞会使别的进程也无法运行。所以希望将进程中“可以同步的部分”分成多个小块分别运行,所有有了多线程的概念。

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

#include

#include


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才能运行

你可能感兴趣的:(对同步与互斥的深入理解)