MST

星途 面试题库

面试题:C语言中Linux多线程并发控制之互斥锁

在Linux环境下使用C语言编写多线程程序时,简述互斥锁的作用,并给出一段使用互斥锁来保护共享资源的简单代码示例,说明关键步骤。
18.8万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

互斥锁的作用

在多线程编程中,互斥锁(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;
}

关键步骤

  1. 定义互斥锁变量:在程序中定义一个pthread_mutex_t类型的变量,如代码中的pthread_mutex_t mutex;
  2. 初始化互斥锁:在使用互斥锁之前,需要通过pthread_mutex_init函数进行初始化,如pthread_mutex_init(&mutex, NULL);,第二个参数NULL表示使用默认的属性。
  3. 加锁:在访问共享资源前,使用pthread_mutex_lock函数对互斥锁进行加锁操作,如pthread_mutex_lock(&mutex);。如果此时互斥锁已经被其他线程锁定,调用线程会被阻塞,直到互斥锁可用。
  4. 访问共享资源:在加锁成功后,线程可以安全地访问共享资源,如代码中对shared_variable进行自增操作。
  5. 解锁:访问完共享资源后,使用pthread_mutex_unlock函数对互斥锁进行解锁操作,如pthread_mutex_unlock(&mutex);,以便其他线程可以获取该互斥锁来访问共享资源。
  6. 销毁互斥锁:当程序不再需要使用互斥锁时,通过pthread_mutex_destroy函数销毁互斥锁,如pthread_mutex_destroy(&mutex);