MST

星途 面试题库

面试题:C语言结构体在多线程编程中的数据共享问题

假设有一个C语言结构体 `struct data { int value; char text[50]; };`,在多线程环境下,多个线程需要读写这个结构体的成员变量。请描述如何确保数据的一致性和避免竞态条件,至少提及一种同步机制,并给出简单的代码示例。
20.5万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

为确保多线程环境下对结构体 struct data { int value; char text[50]; } 成员变量的读写数据一致性并避免竞态条件,可以使用互斥锁(Mutex)这种同步机制。以下是代码示例:

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

struct data {
    int value;
    char text[50];
};

pthread_mutex_t mutex;

void* write_data(void* arg) {
    struct data* data = (struct data*)arg;
    pthread_mutex_lock(&mutex);
    data->value = 42;
    snprintf(data->text, sizeof(data->text), "Hello, World!");
    pthread_mutex_unlock(&mutex);
    return NULL;
}

void* read_data(void* arg) {
    struct data* data = (struct data*)arg;
    pthread_mutex_lock(&mutex);
    printf("Value: %d\n", data->value);
    printf("Text: %s\n", data->text);
    pthread_mutex_unlock(&mutex);
    return NULL;
}

int main() {
    struct data shared_data;
    pthread_t write_thread, read_thread;

    pthread_mutex_init(&mutex, NULL);

    pthread_create(&write_thread, NULL, write_data, &shared_data);
    pthread_create(&read_thread, NULL, read_data, &shared_data);

    pthread_join(write_thread, NULL);
    pthread_join(read_thread, NULL);

    pthread_mutex_destroy(&mutex);

    return 0;
}

在上述代码中:

  1. 定义了 pthread_mutex_t 类型的互斥锁 mutex
  2. write_dataread_data 函数中,通过 pthread_mutex_lock 锁定互斥锁,在访问结构体成员变量前后确保同一时间只有一个线程可以访问,访问结束后通过 pthread_mutex_unlock 解锁互斥锁。
  3. main 函数中,初始化互斥锁,创建写线程和读线程,等待两个线程执行完毕后销毁互斥锁。