pthread_mutex_lock
是 POSIX 线程(pthread)库中的一个函数,用于在多线程程序中实现互斥锁(mutex)。互斥锁是一种同步机制,用于防止多个线程同时访问共享资源,确保在任何给定时间只有一个线程可以访问该资源。
概念:
互斥锁(mutex)是一种保证共享资源在同一时间只能被一个线程访问的机制。当一个线程想要访问共享资源时,它必须先锁定互斥锁;如果互斥锁已经被锁定,线程将阻塞直到互斥锁被解锁。
pthread_mutex_lock
的函数原型如下:
int pthread_mutex_lock(pthread_mutex_t *mutex);
参数说明:
mutex
:指向要锁定的互斥锁的指针。
返回值:- 成功:返回 0。
- 失败:返回错误编号。
使用案例:
以下是一个使用 pthread_mutex_lock
和 pthread_mutex_unlock
的例子,演示了如何在多线程环境中保护共享资源:
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
// 定义一个互斥锁
pthread_mutex_t lock;
// 共享资源
int shared_resource = 0;
// 线程函数
void *thread_function(void *arg) {for (int i = 0; i < 100000; i++) {// 锁定互斥锁pthread_mutex_lock(&lock);// 安全地访问共享资源shared_resource++;// 解锁互斥锁pthread_mutex_unlock(&lock);}return NULL;
}
int main() {pthread_t threads[2];// 初始化互斥锁pthread_mutex_init(&lock, NULL);// 创建两个线程for (int i = 0; i < 2; i++) {if (pthread_create(&threads[i], NULL, thread_function, NULL) != 0) {perror("Failed to create thread");return 1;}}// 等待线程结束for (int i = 0; i < 2; i++) {pthread_join(threads[i], NULL);}// 销毁互斥锁pthread_mutex_destroy(&lock);// 打印共享资源的最终值printf("Shared resource value: %d\n", shared_resource);return 0;
}
在这个例子中:
- 定义了一个全局互斥锁
lock
和一个共享资源shared_resource
。 - 在
thread_function
中,每个线程都会对共享资源shared_resource
进行 100000 次增加操作。 - 在每次增加操作前后,使用
pthread_mutex_lock
和pthread_mutex_unlock
来锁定和解锁互斥锁,确保在修改共享资源时不会发生竞态条件。 - 在
main
函数中,创建了两个线程,并在它们完成后打印共享资源的最终值。
编译时需要链接 pthread 库:
gcc -o mutex_example mutex_example.c -lpthread
运行程序,输出应该显示共享资源的值为 200000,因为两个线程各自增加了 100000 次。
注意事项:
- 在使用互斥锁时,确保每次
pthread_mutex_lock
都有一个对应的pthread_mutex_unlock
,以避免死锁。 - 如果一个线程在持有锁时被取消或终止,而没有释放锁,可能会导致其他线程永远阻塞。
- 互斥锁应该被设计为在所有可能退出函数的路径上都能够解锁,包括正常退出和异常退出。