【Linux】线程同步(互斥锁)

(一)互斥锁

互斥锁(互斥量):允许程序员锁住某个对象,使得的每次只有一个线程访问它。
为了控制对关键代码的访问,必须在进入这段代码之前锁住一个互斥量,在完成关键代码执行后解锁。

(二)互斥锁的调用接口

头文件: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;
}
  • 结果:
    在这里插入图片描述

Guess you like

Origin blog.csdn.net/xiaoxiaoguailou/article/details/121587453