11.2 Linux_线程_同步与互斥

概述

什么是临界资源:

同一时刻只允许一个任务访问的共享资源。

比如写入文件,就是一个临界资源,当写入文件时,不允许两个任务同时往里面写。如果A写入abc,B写入def,同时写的情况下文件中的值不一定为abcdef,这时就需要在某一时刻只允许A写入abc,在另一时刻只允许B写入def。

什么是临界区:

访问临界资源的代码。

什么是互斥机制:

使用mutex互斥锁,在任务访问临界资源前申请锁,访问完后释放锁。

相关函数

1、初始化

//动态初始化
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
                       const pthread_mutexattr_t *restrict attr);
//静态初始化
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

返回值:成功返回0,失败返回错误码

mutex:要初始化的互斥锁

attr:互斥锁属性,NULL代表默认属性

2、销毁

int pthread_mutex_destroy(pthread_mutex_t *mutex);

返回值:成功返回0,失败返回错误码 

mutex:要销毁的互斥锁

3、上锁与解锁

//上锁,无法获得锁时进入阻塞
int pthread_mutex_lock(pthread_mutex_t *mutex);
//上锁,无法获得锁时返回EBUSY,并不阻塞
int pthread_mutex_trylock(pthread_mutex_t *mutex);
//解锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);

返回值:成功返回0,失败返回错误码  

mutex:要进行操作的互斥锁

验证代码

代码功能:

当前有两个线程向同一个文件中写入数据,使用互斥锁保证在同一时刻只有一个线程可以写入文件,当该线程写入完成之后,另一个线程才写入文件。

具体代码实现如下:

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

FILE* fp;
pthread_mutex_t mutex;
void* pthread0(void* arg){
	int i=0;
	char c;
	
	c = *((char*)arg+i);
	pthread_mutex_lock(&mutex);//获取互斥锁
	while(c!='\n'){
		c = *((char*)arg+i);//向文件中按字符写入数据
		fputc(c,fp);
		fflush(fp);
		i++;
		usleep(1);
	}
	pthread_mutex_unlock(&mutex);//释放互斥锁
}
int main(){
	
	pthread_t tid;

	pthread_mutex_init(&mutex,NULL);//初始化互斥锁
	//打开文件
	if((fp = fopen("./file","w")) == NULL){
		perror("fopen");
		return -1;
	}
	//创建线程
	if(pthread_create(&tid,NULL,pthread0,"thread test\n") != 0){
		perror("pthread_create");
		return -1;
	}
	if(pthread_create(&tid,NULL,pthread0,"hello world\n") != 0){
		perror("pthread_create");
		return -1;
	}
	while(1);
	pthread_mutex_destroy(&mutex);//销毁互斥锁
	//关闭文件
	fclose(fp);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值