概述
什么是临界资源:
同一时刻只允许一个任务访问的共享资源。
比如写入文件,就是一个临界资源,当写入文件时,不允许两个任务同时往里面写。如果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;
}