什么是互斥锁
互斥锁是一种用于解决多线程访问共享资源时可能出现的线程安全问题的机制。多个线程需要对共享资源进行访问,而互斥锁可以确保在任意时刻只有一个线程能够访问该资源,从而避免了数据的不一致性和并发访问带来的问题。
简单来说就是多个线程在操作同一片内存时,一个线程正在读这片内存的数据时,另一个线程又去修改了这片内存的数据。这样会造成数据不一致而导致出现严重问题。
使用互斥锁
- 初始化互斥锁:通过pthread_mutex_init函数初始化互斥锁。有静态分配和动态分配两种方式。静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 动态分配:pthread_mutex_t mutex; pthread_mutex_init(&mutex, NULL);
- 使用互斥锁:在需要保护的代码段前,调用pthread_mutex_lock函数上锁。确保处于临界区的线程不被其他线程打断,确保其临界区运行完整。
- 解锁互斥锁:在离开保护的代码段后,调用pthread_mutex_unlock函数解锁。
- 销毁互斥锁:在所有使用过此互斥锁的线程都不再需要使用时,应调用pthread_mutex_destroy函数销毁互斥锁。
下面使用一段代码来验证互斥锁
#include <stdio.h>
#include <pthread.h>
pthread_mutex_t mutex;
void* myfunc_1(void *arg)
{
pthread_mutex_lock(&mutex);
printf("111111\n");
sleep(1);
printf("222222\n");
sleep(1);
pthread_mutex_unlock(&mutex);
}
void* myfunc_2(void *arg)
{
pthread_mutex_lock(&mutex);
printf("333333\n");
sleep(1);
printf("444444\n");
sleep(1);
pthread_mutex_unlock(&mutex);
}
int main()
{
pthread_t tid1, tid2;
pthread_mutex_init(&mutex,NULL);
pthread_create(&tid1, NULL, myfunc_1, NULL);
pthread_create(&tid2, NULL, myfunc_2, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_mutex_destroy(&mutex);
return 0;
}