MST

星途 面试题库

面试题:C语言网络编程中多线程的资源共享问题

在C语言网络编程结合多线程的场景下,假设有多个线程需要访问和修改同一个网络连接的状态信息(比如连接状态、已发送字节数等),请描述可能会出现什么问题,并说明如何使用互斥锁(mutex)来解决这些问题。请给出简单的代码示例。
31.6万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

可能出现的问题

  1. 数据竞争:多个线程同时访问和修改同一个网络连接状态信息时,由于线程执行顺序的不确定性,可能导致数据不一致。例如,一个线程正在读取已发送字节数,同时另一个线程修改了该数值,就会使读取到的数据不准确。
  2. 竞态条件:网络连接状态在不同线程的操作下,其状态变化可能不符合预期。比如,一个线程判断连接状态为断开并准备重新连接,而另一个线程此时将连接状态设为已连接,就会出现逻辑错误。

使用互斥锁解决问题的方法

  1. 初始化互斥锁:在程序开始时,使用 pthread_mutex_init 函数初始化互斥锁。
  2. 加锁:当线程需要访问和修改网络连接状态信息时,先使用 pthread_mutex_lock 函数对互斥锁加锁,这样其他线程就无法同时访问该资源。
  3. 访问和修改数据:加锁成功后,线程可以安全地访问和修改网络连接状态信息。
  4. 解锁:操作完成后,使用 pthread_mutex_unlock 函数解锁互斥锁,允许其他线程访问。

代码示例

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

// 网络连接状态结构体
typedef struct {
    int connected;
    int bytes_sent;
    pthread_mutex_t mutex;
} NetworkConnection;

// 模拟网络连接
NetworkConnection connection = {0, 0, PTHREAD_MUTEX_INITIALIZER};

// 线程函数,模拟发送数据
void* send_data(void* arg) {
    for (int i = 0; i < 5; i++) {
        // 加锁
        pthread_mutex_lock(&connection.mutex);
        connection.connected = 1;
        connection.bytes_sent += 100;
        printf("Thread %ld sent 100 bytes. Total bytes sent: %d\n", (long)pthread_self(), connection.bytes_sent);
        // 解锁
        pthread_mutex_unlock(&connection.mutex);
        sleep(1);
    }
    return NULL;
}

int main() {
    pthread_t threads[3];

    // 创建线程
    for (int i = 0; i < 3; i++) {
        pthread_create(&threads[i], NULL, send_data, NULL);
    }

    // 等待所有线程结束
    for (int i = 0; i < 3; i++) {
        pthread_join(threads[i], NULL);
    }

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

    return 0;
}

在上述代码中:

  1. 定义了一个 NetworkConnection 结构体,包含网络连接状态信息和一个互斥锁。
  2. send_data 线程函数中,每次发送数据前加锁,操作完成后解锁,确保数据的一致性。
  3. main 函数创建了3个线程模拟发送数据,并在最后销毁互斥锁。