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


      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字符串。符合我们的预期。

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

【C/C++多线程编程之六】pthread相互排斥量的更多相关文章

  1. Linux线程相互排斥量--进程共享属性

    多线程中.在相互排斥量和 读写锁的 属性中.都有一个叫 进程共享属性 . 对于相互排斥量,查询和设置这个属性的方法为: pthread_mutexattr_getpshared pthread_mut ...

  2. Linux程序设计学习笔记----多线程编程线程同步机制之相互排斥量(锁)与读写锁

    相互排斥锁通信机制 基本原理 相互排斥锁以排他方式防止共享数据被并发訪问,相互排斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个相互排斥锁逻辑上绑定之后,对该资源的訪问操作例如以下: ...

  3. Linux多线程同步之相互排斥量和条件变量

    1. 什么是相互排斥量 相互排斥量从本质上说是一把锁,在訪问共享资源前对相互排斥量进行加锁,在訪问完毕后释放相互排斥量上的锁. 对相互排斥量进行加锁以后,不论什么其它试图再次对相互排斥量加锁的线程将会 ...

  4. linux系统编程:线程同步-相互排斥量(mutex)

    线程同步-相互排斥量(mutex) 线程同步 多个线程同一时候訪问共享数据时可能会冲突,于是须要实现线程同步. 一个线程冲突的演示样例 #include <stdio.h> #includ ...

  5. 数据共享之相互排斥量mutex

    相互排斥量介绍 相互排斥量能够保护某些代码仅仅能有一个线程运行这些代码.假设有个线程使用相互排斥量运行某些代码,其它线程訪问是会被堵塞.直到这个线程运行完这些代码,其它线程才干够运行. 一个线程在訪问 ...

  6. μCOS-II系统之事件(event)的使用规则及Semaphore的相互排斥量使用方法

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/wavemcu/article/details/27798493 ****************** ...

  7. WinCE C#程序,控制启动时仅仅能启动一个程序,使用相互排斥量来实现,该实现方法測试通过

    </pre><pre code_snippet_id="430174" snippet_file_name="blog_20140718_5_46349 ...

  8. 【C/C++多线程编程之十】pthread线程私有数据

    多线程编程之线程私有数据      Pthread是 POSIX threads 的简称.是POSIX的线程标准.         线程同步从相互排斥量[C/C++多线程编程之六]pthread相互排 ...

  9. android NDK编程:使用posix多线程与mutex相互排斥同步

    MainActivity.java 调用原生方法 posixThreads(int threads, int iterations) 启动线程 package com.apress.threads; ...

随机推荐

  1. C语言块内变量回收问题

    之前有一个错误认识,错误的认为局部变量的回收是发生在函数返回时.其实在块结束时块内使用的内容就会被回收了. 以下的实例说明了问题 ]; ; i < ; ++i) { int item = i; ...

  2. 【转】JNI和NDK的区别

    原文网址:http://blog.csdn.net/ithomer/article/details/6828830 NDK(Native Development Kit)“原生”也就是二进制 andr ...

  3. Hibernate4.x之入门篇

    Hibernate作为一个优秀的持久化框架.ORM框架.在日常的Java开发中常常用到.本文主要通过一个简单的例子来介绍下Hibernate4.x的入门知识. 新建一个Java项目,并加入Hibern ...

  4. 【jQuery日期处理】两个时间大小的比较

    function checkEndTime(){ var startTime=$("#startTime").val(); var start=new Date(startTime ...

  5. Android学习系列(23)--App主界面实现

    在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下 ...

  6. 25、BroadCastRecevier

    BroadCastRecevier 有两种注册方式 1. 清单文件里注册: 一旦应用程序被部署到手机, 广播接受者就会生效 2. 代码里面注册: 一旦代码所在的进程被杀死了, 广播接受者就失效了. 广 ...

  7. 【Python】python-一个class继承的小case

    #-*- coding:utf-8 -*-#定义银行类,包含属性:用户名,账户,余额:包含方法有:查询余额,存钱,取钱class BankAccount(): def __init__(self,na ...

  8. myeclipse10 安装 testng插件

    下载插件: http://pan.baidu.com/s/1c0pghFE 放到dropins目录

  9. .Net高级技术

    本次课程中讲的有的东西都是根据初学者的认知规律进行了调整,并不是严谨的,比如很多地方在多AppDomain条件下很多说法就不对了,但是说严谨了大家就晕了,因此继续不严谨的讲吧. 很多面试题都在这阶段的 ...

  10. nyoj 17 单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...