Linux C系统编程-线程互斥锁(四)

互斥锁

互斥锁也是属于线程之间处理同步互斥方式,有上锁/解锁两种状态。

互斥锁函数接口
1)初始化互斥锁
pthread_mutex_init()
man 3 pthread_mutex_init
(找不到的情况下首先
sudo apt-get install glibc-doc
sudo apt-get install manpages-posix-dev)在这里插入图片描述

动态初始化
int pthread_mutex_init(pthread_mutex_t *mutex,
const pthread_mutexattr_t *attr);

mutex: pthread_mutex_t 互斥锁的数据类型
attr: 锁的属性,普通属性默认是阻塞锁 NULL
在这里插入图片描述
失败返回错误码

静态初始化 默认属性 NULL
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

如果属性是普通属性,则静态初始化与动态初始化一致。
初始化完结果: 锁被创建并且已经处于解锁的状态。

2)上锁 pthread_mutex_lock
man 3 pthread_mutex_lock
在这里插入图片描述

mutex: 必须已经初始化过的互斥锁的地址,并且锁解锁状态才能返回!
失败f返回错误码

3)解锁 pthread_mutex_unlock
man 3 pthread_mutex_unlock

在这里插入图片描述mutex: 必须已经初始化过的互斥锁的地址,并且锁上锁状态才能返回!
失败返回错误码

4)销毁互斥锁 pthread_mutex_destroy()
在这里插入图片描述
man 3 pthread_mutex_destroy
mutex: 必须已经初始化过的互斥锁的地址
失败返回错误码

pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER; //静态初始化

void *Jack_fun(void *arg)
{
	char *p = (char *)arg;
	while(1)
	{
		//发消息的Jack,必须先上锁
		pthread_mutex_lock(&m);
		
		fgets(p,1024,stdin);
		
		//解锁
		pthread_mutex_unlock(&m);
		
		if(strncmp(p,"quit",4) == 0)
		{
			break;
		}
		
		usleep(100000);
	}
	
	pthread_exit(NULL);
	
}

void *Rose_fun(void *arg)
{
	usleep(100000);
	char *p = (char *)arg;
	while(1)
	{
		//接收消息的Rose,后上锁
		pthread_mutex_lock(&m);
		
		printf("from Jack = %s",p);
		
		//解锁
		pthread_mutex_unlock(&m);
		
		if(strncmp(p,"quit",4) == 0)
		{
			break;
		}
		
		usleep(200000);
	}
	
	pthread_exit(NULL);
}

int main()
{
	//1. 申请key值
	key_t key = ftok(".",10);
	
	//2. ID 
	int shmid = shmget(key,1024,IPC_CREAT|0666);
	
	//3. 映射
	char *p = shmat(shmid,NULL,0);
	
	//4. 两个子线程
	pthread_t Jack_tid,Rose_tid;
	pthread_create(&Jack_tid,NULL,Jack_fun,(void *)p);
	pthread_create(&Rose_tid,NULL,Rose_fun,(void *)p);
	
	//5. 接合线程
	pthread_join(Jack_tid,NULL);
	pthread_join(Rose_tid,NULL);
	
	//6. 撤销内存
	shmdt(p);
	shmctl(shmid,IPC_RMID,NULL);
	
	//7. 锁
	pthread_mutex_destroy(&m);
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值