互斥量

互斥量mutex
Linux中提供一把互斥锁mutex(也称为互斥量)。
每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁。
资源还是共享的,线程也还是竞争的;
但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。
但即使有了mutex,如果有线程不按规则来访问数据,依然会造成数据混乱。
主要应用函数:
pthread_mutex_init函数
pthread_mutex_destroy函数
pthread_mutex_lock函数
pthread_mutex_trylock函数
pthread_mutex_unlock函数
以上5个函数的返回值都是:成功返回0,失败返回错误号。
pthread_mutex_t 类型,其本质是一个结构体,为简化理解,应用时可忽略其实现细节,简单当成整数看待。
pthread_mutex_t mutex;变量mutex只有两种取值1、0。
pthread_mutex_init函数
初始化一个互斥锁(互斥量)–>初值可看做1。
pthread_mutex_destroy函数
销毁一个互斥锁。
pthread_mutex_lock函数
加锁。
pthread_mutex_unlock函数
解锁。
pthread_mutex_trylock函数
尝试加锁。
代码示例mutex.c

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

pthread_mutex_t mutex;//定义锁

void *tfn(void *arg)
{
	srand(time(NULL));
	while(1){
		pthread_mutex_lock(&mutex);//上锁
		printf("hello ");
		sleep(rand()%3);
		printf("world\n");
		pthread_mutex_unlock(&mutex);//解锁
		sleep(rand()%3);
	}
	return NULL;
}
int main(void)
{
	pthread_t tid;
	srand(time(NULL));
	pthread_mutex_init(&mutex,NULL);//初始化锁

	pthread_create(&tid,NULL,tfn,NULL);
	while(1){
		pthread_mutex_lock(&mutex);//上锁
		printf("HELLO ");
		sleep(rand() % 3);
		printf("WORLD\n");
		pthread_mutex_unlock(&mutex);//解锁

		sleep(rand() % 3);
	}
	pthread_mutex_destroy(&mutex);//销毁锁
	return 0;
}

gcc -pthread mutex.c
./a.out

结论:在访问共享资源前加锁,访问结束后立即解锁。锁的**“粒度”**应越小越好。
即在sleep之前解锁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值