Linux编程练习 --多线程3--mutex
互斥指互相排斥的锁,是一种信号量,常用来防止两个进程或线程在同一时刻访问相同的共享资源
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,并且修改它,打印出来
- /*mutex.c*/
- #include <stdlib.h>
- #include <stdio.h>
- #include <pthread.h>
- #include <errno.h>
- /*全局变量*/
- int gnum = 0;
- /*互斥量 */
- pthread_mutex_t mutex;
- /*声明线程运行服务程序*/
- static void pthread_func_1 (void);
- static void pthread_func_2 (void);
- int main (void)
- {
- /*线程的标识符*/
- pthread_t pt_1 = 0;
- pthread_t pt_2 = 0;
- int ret = 0;
- /*互斥初始化*/
- pthread_mutex_init (&mutex, NULL);
- /*分别创建线程1、2*/
- ret = pthread_create (&pt_1, //线程标识符指针
- NULL, //默认属性
- (void *)pthread_func_1,//运行函数
- NULL); //无参数
- if (ret != 0)
- {
- perror ("pthread_1_create");
- }
- ret = pthread_create (&pt_2, //线程标识符指针
- NULL, //默认属性
- (void *)pthread_func_2, //运行函数
- NULL); //无参数
- if (ret != 0)
- {
- perror ("pthread_2_create");
- }
- /*等待线程1、2的结束*/
- pthread_join (pt_1, NULL);
- pthread_join (pt_2, NULL);
- printf ("main programme exit!/n");
- return 0;
- }
- /*线程1的服务程序*/
- static void pthread_func_1 (void)
- {
- int i = 0;
- for (;;)
- {
- printf ("This is pthread1!/n");
- pthread_mutex_lock(&mutex); /*获取互斥锁*/
- /*注意,这里以防线程的抢占,以造成一个线程在另一个线程sleep时多次访问互斥资源,所以sleep要在得到互斥锁后调用*/
- sleep (1);
- /*临界资源*/
- gnum++;
- printf ("Thread1 add one to num:%d/n",gnum);
- pthread_mutex_unlock(&mutex); /*释放互斥锁*/
- }
- }
- /*线程2的服务程序*/
- static void pthread_func_2 (void)
- {
- int i = 0;
- for (;;)
- {
- printf ("This is pthread2!/n");
- pthread_mutex_lock(&mutex); /*获取互斥锁*/
- /*注意,这里以防线程的抢占,以造成一个线程在另一个线程sleep时多次访问互斥资源,所以sleep要在得到互斥锁后调用*/
- sleep (1);
- /*临界资源*/
- gnum++;
- printf ("Thread2 add one to num:%d/n",gnum);
- pthread_mutex_unlock(&mutex); /*释放互斥锁*/
- }
- pthread_exit (0);
- }
然后编译,运行,看到是线程1,2分别和平地访问共享资源
Linux编程练习 --多线程3--mutex相关推荐
- Linux编程练习 --多线程4--条件变量
上一篇练习了互斥锁的用法和原理,这次学习和互斥锁一起应用的cond--条件变量 1.互斥锁的存在问题: 互斥锁一个明显的缺点是它只有两种状态:锁定和非锁定.设想一种简单情景:多个线程访问同一个共享资源 ...
- Linux编程练习 --多线程2--属性的设置
在上一篇的练习里,我们用pthread_create函数创建了一个线程,在这个线程中,我们使用了默认参数,即将该函数的第二个参数设为NULL.的确,对大多数程序来说,使用默认属性就够了,但我们还是有必 ...
- Linux编程练习 --多线程1--线程创建
POSIX线程-轻量级进程,线程调度是由内核调度程序完成的,线程所消耗的系统资源比较少,相互通讯也比较容易. 多线程的优点: 1.资源消耗量少.我们知道,在Linux系统下,启动一个新的进程必须分配给 ...
- Linux编程练习 --多线程5--信号量(semaphore)
这一篇练习信号量的应用 信号量本质上是一个非负的整数计数器,也是UNIX中古老的实现进程互斥和同步的手段,Linux下信号量概念是在线程中,信号则在进程控制中,不过原理差不多,最基本最经典的操作莫过于 ...
- Linux下的多线程编程
1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的Unix也支持线程的概念,但是在一个进程(process ...
- Linux多线程编程(一)---多线程基本编程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mybelief321/article/details/9377379 线程概念 线程是指运行中的程序 ...
- linux 线程_Linux 多线程编程(不限Linux)
前言 线程?为什么有了进程还需要线程呢,他们有什么区别?使用线程有什么优势呢?还有多线程编程的一些细节问题,如线程之间怎样同步.互斥,这些东西将在本文中介绍.我在某QQ群里见到这样一道面试题: 是否熟 ...
- Linux开发_多线程编程
Linux下的多线程使用的库是pthread,是一个遵守POSIX接口的函数库. Linux下多线程编程对函数定义原型有要求,必须是void *函数名(void *参数名),或者void 函数名(vo ...
- [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)
本文可任意转载,但必须注明作者和出处. [原创]手把手教你Linux下的多线程设计(一) --Linux下多线程编程详解 原 ...
最新文章
- 谈谈对Spring IOC的理解
- 记录webscraper的使用过程
- php 判断update返回为0_PHP进行数据库更新update操作,返回状态
- 一步步编写操作系统 32 linux内核获取内存容量的方法
- Node/01/案例流程
- mvc可以运行在linux下吗,asp.netmvc部署到linux(centos)
- 设计开发前的产品原型图
- Sql Prompt使用技巧
- 巨杉数据库入选Gartner报告,中国数据库原创力量崛起
- vb中查询mysql_vb数据库查询语句-vb中使用sql语句-vb读取sql语句的字段
- HTML5实现在线拍照功能(调取摄像头API)
- Vue+elementUI下拉框自定义颜色选择器
- 微信公众号API接口调用
- java 支付宝帐单_支付宝单笔提现转账到个人用户,java代码实现
- 一文学会快速傅里叶变换(FFT)
- 怎样在word中打印框选对√
- 14年macmini装双硬盘_2014款Mac mini拆机更换硬盘
- 计算机国二复习攻略,全国计算机等级考试二级复习指导及应试技巧二
- linux cacti安装教程,Linux下Cacti安装与配置
- vs2017配置opencv4.2及QTcreator配置opencv4.2在界面显示图像
热门文章
- 获取淘宝开发平台的sessionKey
- Springcloud整理
- 当你在浏览器输入一个网址,如http://www.taobao.com,按回车之后发生了什么?
- 维修变频器和服务器赚钱吗,【转】一个变频器维修老手的7年经验与心得
- openfeign调用 HttpServletRequest作为参数 报错..
- hibernate基于单表curd
- 【软件开发底层知识修炼】五 gcc-C语言编译器
- 【C++深度剖析教程25】继承中的构造与析构
- Java读源代码学设计模式:适配器Adapter
- 可访问性不一致的原因与解决方法