MST

星途 面试题库

面试题:C语言多线程数据共享之互斥锁使用

在Linux环境下使用C语言进行多线程编程,假设有两个线程需要访问并修改同一个全局变量count。请简述如何使用互斥锁来保证数据的一致性,并给出简单代码示例。
32.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

简述

  1. 定义互斥锁:使用pthread_mutex_t类型定义一个互斥锁变量。
  2. 初始化互斥锁:在主线程中使用pthread_mutex_init函数初始化互斥锁。
  3. 加锁:在每个线程访问和修改全局变量count之前,使用pthread_mutex_lock函数对互斥锁加锁,这样其他线程在该线程持有锁期间无法访问count
  4. 解锁:在访问和修改完count之后,使用pthread_mutex_unlock函数解锁互斥锁,以便其他线程可以获取锁并访问count
  5. 销毁互斥锁:在主线程结束前,使用pthread_mutex_destroy函数销毁互斥锁,释放相关资源。

代码示例

#include <stdio.h>
#include <pthread.h>

// 全局变量
int count = 0;
// 定义互斥锁
pthread_mutex_t mutex;

// 线程函数
void* increment(void* arg) {
    // 加锁
    pthread_mutex_lock(&mutex);
    for (int i = 0; i < 1000000; i++) {
        count++;
    }
    // 解锁
    pthread_mutex_unlock(&mutex);
    return NULL;
}

int main() {
    pthread_t tid1, tid2;

    // 初始化互斥锁
    pthread_mutex_init(&mutex, NULL);

    // 创建线程
    if (pthread_create(&tid1, NULL, increment, NULL) != 0) {
        return 1;
    }
    if (pthread_create(&tid2, NULL, increment, NULL) != 0) {
        return 2;
    }

    // 等待线程结束
    if (pthread_join(tid1, NULL) != 0) {
        return 3;
    }
    if (pthread_join(tid2, NULL) != 0) {
        return 4;
    }

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);

    printf("Final count: %d\n", count);

    return 0;
}