1.基本概念
互斥:控制2个进程使之相互排斥,不同时运行
同步:控制2个进程使之有先有后,次序可控
2.互斥锁
2.1基本概念
对共享数据进行锁定,同一时刻只有一个线程进行操作
这就相当于一个就当的房间,一个房间只能入住一人,当一人入住之后就上锁,若下一个人想入住,只有等前一人解锁之后才能入住
2.2函数接口
操作:初始化、加锁、解锁、销毁
定义
pthread_mutex_t m;
由于互斥锁被多条线程使用,因此将互斥锁定义为全局变量
初始化
未经初始化的互斥锁是无法被使用的。
初始化互斥锁的方法:
- 静态初始化
- 动态初始化
静态初始化
pthread_mutex_t m = PTHREAD_MUTEX_INITIALIZER;
动态初始化
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
参数:
- mutex:互斥锁名称
- attr:互斥锁属性
加锁和解锁
// 加锁
pthread_mutex_lock( &m );
// 解锁
pthread_mutex_unlock( &m );
销毁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
实例代码
#include <stdio.h>
#include <unistd.h>
#include <pthread.h> //线程头文件
//定义锁
pthread_mutex_t m;
char global = 'X';
void *routine(void *arg)
{
pthread_mutex_lock(&m);//加锁
int i = 1000;
while(i>0)
{
i--;
fprintf(stderr,"[%c:%c]",*(char *)arg,global);
}
pthread_mutex_unlock(&m);
pthread_exit(NULL);
}
int main(void)
{
//初始化锁
pthread_mutex_init(&m,NULL);
pthread_t t1,t2,t3;
pthread_create(&t1,NULL,routine,"1");
pthread_create(&t2,NULL,routine,"2");
pthread_create(&t3,NULL,routine,"3");
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_join(t3,NULL);
//销毁锁
pthread_mutex_destroy(&m);
pthread_exit(NULL);
}
结果图:
版权声明:本文为m0_50027156原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。