美文网首页
对同步与互斥的深入理解

对同步与互斥的深入理解

作者: zyz9740 | 来源:发表于2018-10-27 15:09 被阅读0次

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

    #### 多线程:

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

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

    相关文章

      网友评论

          本文标题:对同步与互斥的深入理解

          本文链接:https://www.haomeiwen.com/subject/ewjdtqtx.html