简述使用互斥锁实现线程同步防止资源竞争的方法
- 初始化互斥锁:在使用互斥锁之前,需要对其进行初始化。可以使用
pthread_mutex_init
函数来完成初始化操作。
- 加锁:当线程需要访问共享资源时,先调用
pthread_mutex_lock
函数对互斥锁进行加锁。如果互斥锁已经被其他线程锁住,那么当前线程会被阻塞,直到互斥锁被解锁。
- 访问共享资源:在成功加锁后,线程可以安全地访问共享资源。
- 解锁:在访问完共享资源后,线程需要调用
pthread_mutex_unlock
函数对互斥锁进行解锁,以便其他线程可以获取互斥锁并访问共享资源。
- 销毁互斥锁:当不再需要使用互斥锁时,调用
pthread_mutex_destroy
函数销毁互斥锁,释放相关资源。
代码示例
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
// 定义共享资源
int shared_resource = 0;
// 定义互斥锁
pthread_mutex_t mutex;
// 线程函数
void* thread_function(void* arg) {
// 加锁
pthread_mutex_lock(&mutex);
// 访问共享资源
shared_resource++;
printf("Thread %ld incremented shared_resource to %d\n", (long)arg, shared_resource);
// 解锁
pthread_mutex_unlock(&mutex);
return NULL;
}
int main() {
// 初始化互斥锁
pthread_mutex_init(&mutex, NULL);
pthread_t threads[5];
for (int i = 0; i < 5; i++) {
// 创建线程
if (pthread_create(&threads[i], NULL, thread_function, (void*) (long)i) != 0) {
perror("pthread_create");
return 1;
}
}
for (int i = 0; i < 5; i++) {
// 等待线程结束
if (pthread_join(threads[i], NULL) != 0) {
perror("pthread_join");
return 2;
}
}
// 销毁互斥锁
pthread_mutex_destroy(&mutex);
return 0;
}