互斥量mutex的简单使用

时间:2021-03-13 18:22:23

几个重要的函数:

#include <pthread.h>

int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutex_t *restrict attr);    //初始化mutex

int pthread_mutex_destroy(pthread_mutex_t *mutex);  //如果mutex是动态分配的,则释放内存前调用此函数。

int pthread_mutex_lock(pthread_mutex_t *mutex);    //加锁

int pthread_mutex_trylock(pthread_mutex_t *mutex);  //若已有其他线程占用锁,则返回EBUSY,否则返回0,不阻塞。

int pthread_mutex_unlock(pthread_mutex_t *mutex);   //解锁

例程:

 #include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h> int a = ;
int b = ; pthread_mutex_t lock; void * threadA()
{
pthread_mutex_lock(&lock);
printf("thread A got lock!\n");
a -= ;
sleep(); //如果不加锁,threadB输出会是50和200
b += ; //加锁后会sleep 3秒后,并为b加上50 threadB才能打印
pthread_mutex_unlock(&lock);
printf("thread A released the lock!\n");
a -= ;
} void * threadC()
{
sleep();
while(pthread_mutex_trylock(&lock) == EBUSY) //轮询直到获得锁
{
printf("thread C is trying to get lock!\n");
usleep();
}
printf("thread C got the lock!\n");
a = ;
b = ;
pthread_mutex_unlock(&lock);
printf("thread C released the lock!\n"); } void * threadB()
{
sleep(); //让threadA能先执行
pthread_mutex_lock(&lock);
printf("thread B got the lock! a=%d b=%d\n", a, b);
pthread_mutex_unlock(&lock);
printf("thread B released the lock!\n", a, b);
} int main()
{
pthread_t tida, tidb, tidc;
pthread_mutex_init(&lock, NULL);
pthread_create(&tida, NULL, threadA, NULL);
pthread_create(&tidb, NULL, threadB, NULL);
pthread_create(&tidc, NULL, threadC, NULL);
pthread_join(tida, NULL);
pthread_join(tidb, NULL);
pthread_join(tidc, NULL);
return ;
}