互斥指互相排斥的锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源

1.数据类型:

在Linux下, 线程的互斥量数据类型是pthread_mutex_t,我们定义一个互斥数据可以这样:

pthread_mutex_t mutex;

2.函数说明:
头文件:     pthread.h

(1).互斥锁初始化:

函数原型: int pthread_mutex_init (pthread_mutex_t* mutex,

const pthread_mutexattr_t*   mutexattr);
函数传入值:  mutex:互斥锁。

mutexattr:PTHREAD_MUTEX_INITIALIZER:创建快速互斥锁。

PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP:创建递归互斥锁。

PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:创建检错互斥锁。

函数返回值: 成功:0

出错:-1 
(2).互斥操作函数

int pthread_mutex_lock(pthread_mutex_t* mutex);//上锁

int pthread_mutex_trylock (pthread_mutex_t* mutex);//只有在互斥被锁住的情况下才阻塞

int pthread_mutex_unlock (pthread_mutex_t* mutex);//解锁

int pthread_mutex_destroy (pthread_mutex_t* mutex);//清除互斥锁

函数传入值:            mutex:互斥锁。

函数返回值:           成功:0

出错:-1

3.使用形式:

struct mutex mutex;

mutex_init(&mutex); /*定义*/

...
mutex_lock(&mutex); /*获取互斥锁*/

... /*临界资源*/

mutex_unlock(&mutex); /*释放互斥锁*/

最后进行一个练习:我们创建两个线程,分别访问全局变量gnum,并且修改它,打印出来

[cpp] view plaincopy
  1. /*mutex.c*/
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <pthread.h>
  5. #include <errno.h>
  6. /*全局变量*/
  7. int gnum = 0;
  8. /*互斥量 */
  9. pthread_mutex_t mutex;
  10. /*声明线程运行服务程序*/
  11. static void pthread_func_1 (void);
  12. static void pthread_func_2 (void);
  13. int main (void)
  14. {
  15. /*线程的标识符*/
  16. pthread_t pt_1 = 0;
  17. pthread_t pt_2 = 0;
  18. int ret = 0;
  19. /*互斥初始化*/
  20. pthread_mutex_init (&mutex, NULL);
  21. /*分别创建线程1、2*/
  22. ret = pthread_create (&pt_1,          //线程标识符指针
  23. NULL,          //默认属性
  24. (void *)pthread_func_1,//运行函数
  25. NULL);          //无参数
  26. if (ret != 0)
  27. {
  28. perror ("pthread_1_create");
  29. }
  30. ret = pthread_create (&pt_2,          //线程标识符指针
  31. NULL,           //默认属性
  32. (void *)pthread_func_2, //运行函数
  33. NULL);          //无参数
  34. if (ret != 0)
  35. {
  36. perror ("pthread_2_create");
  37. }
  38. /*等待线程1、2的结束*/
  39. pthread_join (pt_1, NULL);
  40. pthread_join (pt_2, NULL);
  41. printf ("main programme exit!/n");
  42. return 0;
  43. }
  44. /*线程1的服务程序*/
  45. static void pthread_func_1 (void)
  46. {
  47. int i = 0;
  48. for (;;)
  49. {
  50. printf ("This is pthread1!/n");
  51. pthread_mutex_lock(&mutex); /*获取互斥锁*/
  52. /*注意,这里以防线程的抢占,以造成一个线程在另一个线程sleep时多次访问互斥资源,所以sleep要在得到互斥锁后调用*/
  53. sleep (1);
  54. /*临界资源*/
  55. gnum++;
  56. printf ("Thread1 add one to num:%d/n",gnum);
  57. pthread_mutex_unlock(&mutex); /*释放互斥锁*/
  58. }
  59. }
  60. /*线程2的服务程序*/
  61. static void pthread_func_2 (void)
  62. {
  63. int i = 0;
  64. for (;;)
  65. {
  66. printf ("This is pthread2!/n");
  67. pthread_mutex_lock(&mutex); /*获取互斥锁*/
  68. /*注意,这里以防线程的抢占,以造成一个线程在另一个线程sleep时多次访问互斥资源,所以sleep要在得到互斥锁后调用*/
  69. sleep (1);
  70. /*临界资源*/
  71. gnum++;
  72. printf ("Thread2 add one to num:%d/n",gnum);
  73. pthread_mutex_unlock(&mutex); /*释放互斥锁*/
  74. }
  75. pthread_exit (0);
  76. }

然后编译,运行,看到是线程1,2分别和平地访问共享资源

Linux编程练习 --多线程3--mutex相关推荐

  1. Linux编程练习 --多线程4--条件变量

    上一篇练习了互斥锁的用法和原理,这次学习和互斥锁一起应用的cond--条件变量 1.互斥锁的存在问题: 互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定.设想一种简单情景:多个线程访问同一个共享资源 ...

  2. Linux编程练习 --多线程2--属性的设置

    在上一篇的练习里,我们用pthread_create函数创建了一个线程,在这个线程中,我们使用了默认参数,即将该函数的第二个参数设为NULL.的确,对大多数程序来说,使用默认属性就够了,但我们还是有必 ...

  3. Linux编程练习 --多线程1--线程创建

    POSIX线程-轻量级进程,线程调度是由内核调度程序完成的,线程所消耗的系统资源比较少,相互通讯也比较容易. 多线程的优点: 1.资源消耗量少.我们知道,在Linux系统下,启动一个新的进程必须分配给 ...

  4. Linux编程练习 --多线程5--信号量(semaphore)

    这一篇练习信号量的应用 信号量本质上是一个非负的整数计数器,也是UNIX中古老的实现进程互斥和同步的手段,Linux下信号量概念是在线程中,信号则在进程控制中,不过原理差不多,最基本最经典的操作莫过于 ...

  5. Linux下的多线程编程

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process ...

  6. Linux多线程编程(一)---多线程基本编程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mybelief321/article/details/9377379 线程概念 线程是指运行中的程序 ...

  7. linux 线程_Linux 多线程编程(不限Linux)

    前言 线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步.互斥,这些东西将在本文中介绍.我在某QQ群里见到这样一道面试题: 是否熟 ...

  8. Linux开发_多线程编程

    Linux下的多线程使用的库是pthread,是一个遵守POSIX接口的函数库. Linux下多线程编程对函数定义原型有要求,必须是void *函数名(void *参数名),或者void 函数名(vo ...

  9. [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)

    本文可任意转载,但必须注明作者和出处. [原创]手把手教你Linux下的多线程设计(一)                                       --Linux下多线程编程详解 原 ...

最新文章

  1. 谈谈对Spring IOC的理解
  2. 记录webscraper的使用过程
  3. php 判断update返回为0_PHP进行数据库更新update操作,返回状态
  4. 一步步编写操作系统 32 linux内核获取内存容量的方法
  5. Node/01/案例流程
  6. mvc可以运行在linux下吗,asp.netmvc部署到linux(centos)
  7. 设计开发前的产品原型图
  8. Sql Prompt使用技巧
  9. 巨杉数据库入选Gartner报告,中国数据库原创力量崛起
  10. vb中查询mysql_vb数据库查询语句-vb中使用sql语句-vb读取sql语句的字段
  11. HTML5实现在线拍照功能(调取摄像头API)
  12. Vue+elementUI下拉框自定义颜色选择器
  13. 微信公众号API接口调用
  14. java 支付宝帐单_支付宝单笔提现转账到个人用户,java代码实现
  15. 一文学会快速傅里叶变换(FFT)
  16. 怎样在word中打印框选对√
  17. 14年macmini装双硬盘_2014款Mac mini拆机更换硬盘
  18. 计算机国二复习攻略,全国计算机等级考试二级复习指导及应试技巧二
  19. linux cacti安装教程,Linux下Cacti安装与配置
  20. vs2017配置opencv4.2及QTcreator配置opencv4.2在界面显示图像

热门文章

  1. 获取淘宝开发平台的sessionKey
  2. Springcloud整理
  3. 当你在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?
  4. 维修变频器和服务器赚钱吗,【转】一个变频器维修老手的7年经验与心得
  5. openfeign调用 HttpServletRequest作为参数 报错..
  6. hibernate基于单表curd
  7. 【软件开发底层知识修炼】五 gcc-C语言编译器
  8. 【C++深度剖析教程25】继承中的构造与析构
  9. Java读源代码学设计模式:适配器Adapter
  10. 可访问性不一致的原因与解决方法