多线程的链表操作

时间:2014-09-15 23:05:48

标签: c

我有以下用于链表操作的代码段:

#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)

如果多线程同时更新此链表,是否有任何问题?假设我的程序中有两个线程,每个线程需要将一个节点附加到此链接列表。可能的最终链接列表是什么?

3 个答案:

答案 0 :(得分:0)

是的,有问题。假设您有一个节点和两个线程。

让我们说两者都准备好插入一个节点。哪一个先来?它们是否与一个节点的列表或两个节点的列表有关。一般来说,你不确定会发生什么!

列表中的插入(列表对所有线程可见)被称为关键部分,应该这样处理!

答案 1 :(得分:0)

当然有一个问题。两者都可以执行if(head) {,而对于每个add,前一个将是当前head。现在你有一个定义不明确的列表,它更像是一棵树。

答案 2 :(得分:0)

是的,会有问题。如果你正在使用同一个内存的多个线程。在某些时候,你肯定会得到意想不到的结果。

考虑使用lockssemaphores来消除任何可能的竞争条件。