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


      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. 自定义一个compass可编译的目录结构

    在学习compass的过程中, 根绝文档说明,如果使用compass create myObject命令会创建一个标准的Compass项目目录结构,如下图: 此时如果使用compass compile ...

  2. bzoj2431:[HAOI2009]逆序对数列

    单组数据比51nod的那道题还弱...而且连优化都不用了.. #include<cstdio> #include<cstring> #include<cctype> ...

  3. POJ 3207 Ikki's Story IV - Panda's Trick (2-SAT,基础)

    题意: 有一个环,环上n个点,现在在m个点对之间连一条线,线可以往圆外面绕,也可以往里面绕,问是否必定会相交? 思路: 根据所给的m条边可知,假设给的是a-b,那么a-b要么得绕环外,要么只能在环内, ...

  4. UVA 10510 Cactus

    题意:给出一个有向图,问是不是仙人掌图.仙人掌图:每个边只在一个普通环内的强连通图. 解法:tarjan判断强连通分量是否为1个,记录找环的路径,在每找到一个环时遍历路径记录点出现的次数,如果出现有点 ...

  5. java jvm学习笔记九(策略文件)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao/article/details/8271407 课程源码:http://download.csdn.net/detail ...

  6. 查询Table name, Column name, 拼接执行sql文本, 游标, 存储过程, 临时表

    018_Proc_UpdateTranslations.sql: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO if (exists (select ...

  7. 转载--PHP json_encode() 和json_decode()函数介绍

    转自:http://www.nowamagic.net/php/php_FunctionJsonEncode.php 转自:http://www.jb51.net/article/30489.htm ...

  8. C/C++:原码、反码和补码

    正数的原码.反码和补码是一模一样的.   负数的反码的符号位跟原码一样,但其余各位取反. 负数的补码是其反码的最末位加1得到,即原码取反加1.   补码的补码就是原码.   浮点数的存储格式随着机器的 ...

  9. bzoj 1038 [ZJOI2008]瞭望塔(半平面交)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1038 [题意] 找一个最低塔高使可以看到村庄的每一个角落. [思路] 半平面交 能够看 ...

  10. POJ 3254 poj3254 Corn Fields

    题意:给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法. 思路: DP[i][j]=sum(dp[i-1][k]); i表示当前 ...