C 多线程链表操作

C 多线程链表操作,c,C,我有以下用于链表操作的代码段: #define MPL_DL_APPEND_NP(head,add,_next,_prev) \ do { \ if (head) {

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

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

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

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

假设它们都准备好插入一个节点。哪一个先来?它们是与一个节点列表有关还是与两个节点列表有关。一般来说,你不知道会发生什么


在列表中的插入(所有线程都可以看到该列表)被称为关键部分,应该这样处理

当然有个问题。如果(头部)有可能
{
将对这两个线程执行,并且对于每个
添加
,前面的将是当前的
。现在您有一个定义不清的列表,更像是一棵树。

是的,会有问题。如果您在同一内存空间中使用多个线程,那么在某个时刻您肯定会得到意外的结果。

>
考虑使用并消除任何可能的争用条件。

这到底是一个宏而不是一个函数吗?第一:添加反斜杠。第二:不要这样做。是的,那是反斜杠。这只是复制和粘贴问题。这部分代码在关键部分。出于性能原因,我必须将它放在宏中或作为内联函数。