面试题答案
一键面试互斥锁的作用
在多线程编程中,互斥锁(Mutex,即Mutual Exclusion的缩写)用于保护共享资源,确保同一时间只有一个线程能够访问该共享资源,避免多个线程同时访问共享资源导致的数据竞争和不一致问题,从而保证程序的正确性和稳定性。
代码示例
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
// 共享资源
int shared_variable = 0;
// 互斥锁
pthread_mutex_t mutex;
// 线程函数
void* increment(void* arg) {
// 加锁
pthread_mutex_lock(&mutex);
for (int i = 0; i < 1000000; i++) {
shared_variable++;
}
// 解锁
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
// 初始化互斥锁
pthread_mutex_init(&mutex, NULL);
pthread_t thread1, thread2;
// 创建线程
pthread_create(&thread1, NULL, increment, NULL);
pthread_create(&thread2, NULL, increment, NULL);
// 等待线程结束
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
// 销毁互斥锁
pthread_mutex_destroy(&mutex);
printf("Final value of shared_variable: %d\n", shared_variable);
return 0;
}
关键步骤
- 定义互斥锁变量:在程序中定义一个
pthread_mutex_t
类型的变量,如代码中的pthread_mutex_t mutex;
。 - 初始化互斥锁:在使用互斥锁之前,需要通过
pthread_mutex_init
函数进行初始化,如pthread_mutex_init(&mutex, NULL);
,第二个参数NULL
表示使用默认的属性。 - 加锁:在访问共享资源前,使用
pthread_mutex_lock
函数对互斥锁进行加锁操作,如pthread_mutex_lock(&mutex);
。如果此时互斥锁已经被其他线程锁定,调用线程会被阻塞,直到互斥锁可用。 - 访问共享资源:在加锁成功后,线程可以安全地访问共享资源,如代码中对
shared_variable
进行自增操作。 - 解锁:访问完共享资源后,使用
pthread_mutex_unlock
函数对互斥锁进行解锁操作,如pthread_mutex_unlock(&mutex);
,以便其他线程可以获取该互斥锁来访问共享资源。 - 销毁互斥锁:当程序不再需要使用互斥锁时,通过
pthread_mutex_destroy
函数销毁互斥锁,如pthread_mutex_destroy(&mutex);
。