zoukankan      html  css  js  c++  java
  • 【C/C++多线程编程之六】pthread相互排斥量

    多线程编程之线程同步相互排斥量


          Pthread是 POSIX threads 的简称,是POSIX的线程标准

             Pthread线程同步多个线程协调地,有序地同步使用共享资源【C/C++多线程编程之五】pthread线程深入理解中讲述到,多线程共享进程资源,一个线程訪问共享资源须要一段完整地时间才干完毕其读写操作,假设在这段时间内被其它线程打断,就会产生各种不可预知的错误。协调线程按一定的规则,不受打搅地訪问共享资源,保证正确性,这便是线程同步的出发点。
           相互排斥量,是最简单的线程同步机制。也是最经常使用的同步策略。
           
           1.相互排斥量mutex

           相互排斥量是一种线程同步对象,“相互排斥”的含义是同一时刻仅仅能有一个线程获得相互排斥量。一个相互排斥量相应一个共享资源。相互排斥量状态:1.解锁状态意味着共享资源可用,2.加锁状态意味着共享资源不可用

           一个线程须要使用共享资源时。使用thread_mutex_lock申请:1.当相互排斥量为解锁状态,则占用相互排斥量,并给相互排斥量加锁,占用资源(互相量为加锁状态,其它线程不能使用相互排斥量并等待相互排斥量变为解锁状态),2.假设相互排斥量为加锁状态,则线程等待,直到相互排斥量为解锁状态(其它线程使用完共享资源后会解锁相互排斥量,释放资源)。

            2.相互排斥量基本函数        
            #include <pthread.h>
    初始化相互排斥量:
            int pthread_mutex_init(pthread_mutex *mutex,
                                                    const pthread_mutexattr_t* mutexattr
    );
            该函数第一个參数为一个相互排斥量指针。第二个參数为相互排斥量属性指针(一般设为NULL)。该函数将依照相互排斥量属性对相互排斥量进行初始化。
    相互排斥量加锁:
            int pthread_mutex_lock(pthread_mutex *mutex);
            该函数申请一个相互排斥量并对其进行加锁,使该相互排斥量对其它线程不可用,让其它申请相互排斥量的线程等待。
    相互排斥量解锁:
            int pthread_mutex_unlock(pthread_mutex *mutex);
            该函数对相互排斥量进行解锁操作,使该相互排斥量对其它线程能够。
    销毁相互排斥量:
            int pthread_mutex_destroy(pthread_mutex *mutex);
            该函数销毁一个不再须要的相互排斥量,释放系统资源。
              
               3.牛刀小试
                  线程My_thread_1将共享资源字符串Share写成aaaaaaaa,线程My_thread_2则将其写成eeeeeeee。
           不启用相互排斥量的情况下。两个线程对共享资源的訪问是随机而且无规律,相互干扰打断,产生a和e混合的字符串,这显然不是我们期望的结果。
           启用相互排斥量(去掉凝视)情况下。相互排斥量机制其作用,两个线程同步协调地訪问共享资源Share。产生aaaaaaaa或eeeeeeee字符串。符合我们的预期。

     

             通过该演示样例,读者能够直观地感受到相互排斥量的作用,亲身体会相互排斥量机制,同一时候能让读者了解相互排斥量的内在原理。

  • 相关阅读:
    【模拟练习】[一]
    【搜索练习】【二】
    【搜索练习】【一】
    模板整理 (施工中 2017.8.30更新)
    常用STL整理 (施工中 2017.8.11更新)
    剑指Offer 反转链表
    剑指Offer 链表中倒数第k个结点
    剑指Offer 斐波那契数列
    剑指Offer 用两个栈实现队列
    剑指Offer 从尾到头打印链表
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/5341854.html
Copyright © 2011-2022 走看看