📅  最后修改于: 2023-12-03 15:32:42.393000             🧑  作者: Mango
在多线程编程中,为了避免竞争条件(race condition)的出现,必须使用线程同步机制。其中最常见的一种机制就是使用互斥锁(mutex)。
互斥锁能够确保在任意时刻只有一个线程可以访问共享资源。当一个线程持有互斥锁时,其他线程就会被阻塞,直到该线程释放了锁。因此,互斥锁常用于对共享资源的访问进行控制,以避免并发访问产生问题。
在Linux系统中,互斥锁是通过pthread库提供的pthread_mutex_t结构体实现的。下面是一个简单的使用互斥锁保护共享变量的代码:
#include <pthread.h>
#include <stdio.h>
pthread_mutex_t mutex;
int count = 0;
void *increment(void *arg) {
int i;
for (i = 0; i < 1000000; i++) {
pthread_mutex_lock(&mutex);
count++;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
int main() {
pthread_t thread1, thread2;
pthread_mutex_init(&mutex, NULL);
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("count: %d\n", count);
return 0;
}
上述代码使用了互斥锁对全局变量count进行保护,两个线程依次对count进行1000000次自增操作。通过多次运行该程序,我们可以发现count的值都是2000000。
在程序中,我们首先使用pthread_mutex_init()函数初始化互斥锁。然后创建两个线程来调用increment()函数,该函数内部会对count进行自增操作,此时使用pthread_mutex_lock()函数获取互斥锁,以确保任何时刻只有一个线程能够对count进行修改。当一个线程完成对count的修改后,使用pthread_mutex_unlock()函数释放互斥锁,以便其他线程能够获取到该锁进行访问。
最后,我们使用pthread_mutex_destroy()函数销毁互斥锁。