我有以下用于链表操作的代码段:
#define MPL_DL_APPEND_NP(head,add,_next,_prev) \
do { \
if (head) { \
(add)->_prev = (head)->_prev; \
(head)->_prev->_next = (add); \
(head)->_prev = (add); \
(add)->_next = NULL; \
} else { \
(head)=(add); \
(head)->_prev = (head); \
(head)->_next = NULL; \
} \
} while (0)
如果多线程同时更新此链表,是否有任何问题?假设我的程序中有两个线程,每个线程需要将一个节点附加到此链接列表。可能的最终链接列表是什么?
答案 0 :(得分:0)
是的,有问题。假设您有一个节点和两个线程。
让我们说两者都准备好插入一个节点。哪一个先来?它们是否与一个节点的列表或两个节点的列表有关。一般来说,你不确定会发生什么!
列表中的插入(列表对所有线程可见)被称为关键部分,应该这样处理!
答案 1 :(得分:0)
当然有一个问题。两者都可以执行if(head) {
,而对于每个add
,前一个将是当前head
。现在你有一个定义不明确的列表,它更像是一棵树。
答案 2 :(得分:0)
是的,会有问题。如果你正在使用同一个内存的多个线程。在某些时候,你肯定会得到意想不到的结果。
考虑使用locks和semaphores来消除任何可能的竞争条件。