Linux学习笔记之互斥锁

本文介绍了Linux下多线程编程中的互斥锁机制,包括互斥锁的创建、初始化、加锁、解锁和销毁。通过示例详细阐述了互斥锁在保证代码段排他性访问中的作用,同时讨论了互斥锁可能导致的问题,如线程执行次序无法指定、加锁位置不当可能造成的问题,以及互斥锁在内存区域的使用限制。最后提出了设计互斥锁功能函数的实践练习。
摘要由CSDN通过智能技术生成

多线程编程 之 互斥和同步;

互斥 ===》互斥锁 ===》pthread_mutex_t

使用操作框架:
创建互斥锁 ===》初始化互斥锁 ====》加锁、解锁 ===》销毁互斥锁;

1、创建互斥锁:使用互斥锁类型定义一个全局变量;
pthread_mutex_t mutex;

2、初始化互斥锁:pthread_mutex_init
int pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr);
功能:该函数用于互斥锁的默认初始化,将锁的默认属性生效;
参数:mutex 要初始化的目标互斥锁#
atrr 要初始化的互斥锁属性值,一般NULL表示默认属性;
返回值:成功 0
失败 -1;

注意:一般在线程创建之前就要初始化互斥锁;

3、加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:该函数可以将某个区域的代码执行加锁操作
保证该部分代码的排他性访问;

参数: mutex 要加锁的互斥锁

返回值:0 成功 进程将会执行该行代码以后的其他语句
-1 失败 不会返回,会继续在该行代码位置阻塞等待解锁;

解锁:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:该函数的操作与加锁操作功能相反,用于已经加锁的
互斥锁进行解锁操作;
参数:mutex 要解锁的互斥锁
返回值:成功 0 互斥锁解锁
失败 -1

注意:加锁和解锁的目标对象针对的是代码行;
加锁==解锁之间的代码属于原子操作;
互斥锁存在的问题:不能指定执行线程的次序,有可能出现抢锁执行现象;

销毁互斥锁:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:该函数用于互斥锁的销毁操作,目的是在使用互斥锁
的时候需要重新初始化;
参数: mutex 互斥锁;
返回值:成功 0
失败 -1;

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

int  x = 0;
//pthread_mutex_t   mutex;   定义一个全局互斥锁

void * fun1(void * arg)
{
   
	pthread_mutex_t *pmutex = (pthread_mutex_t *)arg;
	pthread_mutex_lock(pmutex);   ///开始互斥锁加锁
	x = 0;
	while(1) 
	{
   	
		sleep(1);
		printf("fun1 x-- = %d \n",x-=2);
		if(x <= 10) break;
	}
	pthread_mutex_unlock(pmutex);  ///互斥锁解锁
	pthread_exit(0);
}
void * fun2(void * arg)
{
   
	pthread_mutex_t *pmutex = (pthread_mutex_t *</
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值