面试题答案
一键面试可能出现的问题
- 数据竞争:多个线程同时访问和修改同一个网络连接状态信息时,由于线程执行顺序的不确定性,可能导致数据不一致。例如,一个线程正在读取已发送字节数,同时另一个线程修改了该数值,就会使读取到的数据不准确。
- 竞态条件:网络连接状态在不同线程的操作下,其状态变化可能不符合预期。比如,一个线程判断连接状态为断开并准备重新连接,而另一个线程此时将连接状态设为已连接,就会出现逻辑错误。
使用互斥锁解决问题的方法
- 初始化互斥锁:在程序开始时,使用
pthread_mutex_init
函数初始化互斥锁。 - 加锁:当线程需要访问和修改网络连接状态信息时,先使用
pthread_mutex_lock
函数对互斥锁加锁,这样其他线程就无法同时访问该资源。 - 访问和修改数据:加锁成功后,线程可以安全地访问和修改网络连接状态信息。
- 解锁:操作完成后,使用
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;
}
在上述代码中:
- 定义了一个
NetworkConnection
结构体,包含网络连接状态信息和一个互斥锁。 - 在
send_data
线程函数中,每次发送数据前加锁,操作完成后解锁,确保数据的一致性。 main
函数创建了3个线程模拟发送数据,并在最后销毁互斥锁。