#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
// 定义双向链表节点
struct Node {
int data;
struct Node *prev;
struct Node *next;
};
// 定义互斥锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 在链表头部插入新节点的函数
void insertNode(struct Node **head, int value) {
// 加锁
pthread_mutex_lock(&mutex);
struct Node *newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = value;
newNode->prev = NULL;
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
newNode->next = *head;
(*head)->prev = newNode;
*head = newNode;
}
// 解锁
pthread_mutex_unlock(&mutex);
}
思路及线程安全措施
- 处理
head
为NULL
的情况:在函数内部,当*head
为NULL
时,说明链表为空。此时直接将新创建的节点赋值给*head
,让新节点成为链表的唯一节点。
- 线程安全措施:为确保多线程环境下对
NULL
指针处理的线程安全,使用互斥锁(pthread_mutex_t
)。在进行插入操作前,通过pthread_mutex_lock
加锁,保证同一时间只有一个线程能执行插入操作,防止多个线程同时修改链表头指针,避免出现竞争条件。操作完成后,使用pthread_mutex_unlock
解锁。这样在多线程环境下,对head
指针(包括NULL
指针情况)的处理是线程安全的。