文章目录
(一)互斥锁
互斥锁(互斥量):允许程序员锁住某个对象,使得的每次只有一个线程访问它。
为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,在完成关键代码执行后解锁。
(二)互斥锁的调用接口
头文件:pthread.h
依赖pthread线程库
(1)初始化锁
int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* mutexattr);
- mutexattr:是锁的属性,可以是NULL
(2)加锁
int pthread_mutex_lock(pthread_mutex_t* mutex);
(3)解锁
int pthread_mutex_unlock(pthread_mutex_t* mutex);
(4)销毁锁
int pthread_mutex_destroy(pthread_mutex_t* mutex);
- 返回值:成功0,失败返回错误代码不设置errno
(三)互斥锁的简单使用
有两个线程,第一个线程输出AA,第二个线程输出BB,确保AA中间不能出现ABA或者BAB的输出方式;
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>
pthread_mutex_t mutex;
void* pthread_fun(void* arg)
{
for(int i = 0; i < 3; i++)
{
pthread_mutex_lock(&mutex);
printf("B");
fflush(stdout);
sleep(rand() % 3);
printf("B");
fflush(stdout);
pthread_mutex_unlock(&mutex);
sleep(rand() % 3);
}
}
int main()
{
pthread_mutex_init(&mutex, NULL);
pthread_t id;
int ret = pthread_create(&id, NULL, pthread_fun, NULL);
if(ret == -1)
{
perror("create pthread err");
return -1;
}
for(int i = 0; i < 3; i++)
{
pthread_mutex_lock(&mutex);
printf("A");
fflush(stdout);
sleep(rand() % 3);
printf("A");
fflush(stdout);
pthread_mutex_unlock(&mutex);
sleep(rand() % 3);
}
pthread_join(id, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}
- 结果: