MST

星途 面试题库

面试题:C语言中Linux多线程服务器模型下互斥锁的应用

在Linux C语言多线程服务器模型中,假设存在多个线程需要访问共享资源,请简述如何使用互斥锁来实现线程同步,防止资源竞争。并给出一个简单的代码示例,展示互斥锁的初始化、加锁、解锁和销毁过程。
25.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

简述使用互斥锁实现线程同步防止资源竞争的方法

  1. 初始化互斥锁:在使用互斥锁之前,需要对其进行初始化。可以使用 pthread_mutex_init 函数来完成初始化操作。
  2. 加锁:当线程需要访问共享资源时,先调用 pthread_mutex_lock 函数对互斥锁进行加锁。如果互斥锁已经被其他线程锁住,那么当前线程会被阻塞,直到互斥锁被解锁。
  3. 访问共享资源:在成功加锁后,线程可以安全地访问共享资源。
  4. 解锁:在访问完共享资源后,线程需要调用 pthread_mutex_unlock 函数对互斥锁进行解锁,以便其他线程可以获取互斥锁并访问共享资源。
  5. 销毁互斥锁:当不再需要使用互斥锁时,调用 pthread_mutex_destroy 函数销毁互斥锁,释放相关资源。

代码示例

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

// 定义共享资源
int shared_resource = 0;
// 定义互斥锁
pthread_mutex_t mutex;

// 线程函数
void* thread_function(void* arg) {
    // 加锁
    pthread_mutex_lock(&mutex);
    // 访问共享资源
    shared_resource++;
    printf("Thread %ld incremented shared_resource to %d\n", (long)arg, shared_resource);
    // 解锁
    pthread_mutex_unlock(&mutex);
    return NULL;
}

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

    pthread_t threads[5];
    for (int i = 0; i < 5; i++) {
        // 创建线程
        if (pthread_create(&threads[i], NULL, thread_function, (void*) (long)i) != 0) {
            perror("pthread_create");
            return 1;
        }
    }

    for (int i = 0; i < 5; i++) {
        // 等待线程结束
        if (pthread_join(threads[i], NULL) != 0) {
            perror("pthread_join");
            return 2;
        }
    }

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

    return 0;
}