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


      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. I.MX6 PMU MMPF0100 driver porting

    /************************************************************************** * I.MX6 MMPF0100 driver ...

  2. Mysql slave 状态之Seconds_Behind_Master

    在MySQL的主从环境中,我们可以通过在slave上执行show slave status来查看slave的一些状态信息,其中有一个比较重要的参数Seconds_Behind_Master.那么你是否 ...

  3. Hibernate4.x之Session

    Hibernate Session概述 Session接口是Hibernate向应用程序提供的操纵数据库的最主要的接口,它提供了基本的保存.更新.删除和加载Java对象的方法. Session具有一个 ...

  4. GP(Geoprocessing)服务的发布与调用

    转自:http://www.cnblogs.com/gisangela/archive/2011/01/06/1927702.html 1.什么是GP服务 GP服务是Geoprocessing服务的简 ...

  5. myeclipse10 安装 testng插件

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

  6. 第一个GTK+程序

    在这一章节中,我们将开始编写第一个GTK+程序. 超级简单的例子 我们要“制造”一个超级简单的GTK+程序.就是显示一个空白的窗口. #include <gtk/gtk.h> int ma ...

  7. gSoap的 “error LNK2001: 无法解析的外部符号 _namespaces”解决方法

    gSoap是C/C++开发webService服务第三方的公开类库. 出现上述错误是因为缺少必要的头文件导致的. 在用wsdl2h生成头文件的时候,一并生成了类似 xx.nsmap 的文件,这个文件实 ...

  8. while (cin&gt;&gt;str)退出死循环

    今天在练习的时候突然发现了这个问题,百度之感觉还挺常见的,故记之! //题目描述 // //写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串. // //输入描述 : //输入一个 ...

  9. python PIL下的各种问题

    为了实现验证码的功能,使用了PIL.结果出现各种问题: 先是"ImportError: The _imagingft C module is not installed",goog ...

  10. 本地已有SVN项目导入到eclipse中

    有时候在本地上checkout了项目,在eclipse中不希望重新checkout一次,可以如下操作: 1.在project上右键-> team -> share project -> ...