📜  Linux 线程同步的互斥锁(1)

📅  最后修改于: 2023-12-03 15:32:42.393000             🧑  作者: Mango

Linux线程同步的互斥锁

在多线程编程中,为了避免竞争条件(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()函数销毁互斥锁。