Я читаю книгу о потоках POSIX для некоторой практики, и я пытался решить, где мне понадобится мьютекс-защита в простом односвязном списке, как небольшая проблема для практики.Например, если у меня был список структур узлов:
template <typename T>
struct Node
{
Node<T>* next;
T data;
};
Node<T>* head = NULL;
//Populate list starting at head...
[HEAD] --> [NEXT] --> [NEXT] --> [NEXT] --> [...] --> [NULL]
и у меня было два или более потоков.Любой поток может вставить, удалить или прочитать в любой точке списка.
Кажется, что если вы просто попытаетесь защитить отдельные элементы списка (а не весь список), вы никогда не сможете гарантировать, что другой поток не будетизменяя тот, на который указывает следующий * указатель, таким образом, вы не можете гарантировать безопасность и обслуживание инвариантов.
Есть ли более эффективный способ защиты этого списка, чем использование всех операций над ним с использованием одного и того же мьютекса?Я бы подумал, что есть, но я действительно не могу думать об этом.
Кроме того, если бы это был двусвязный список, ситуация изменилась бы?