Оскільки я сам був дещо розгублений, я починаю з уточнення кількох понять у питанні.
Колекція . Я не бачу причин витрачати час суворо на визначення того, що означає "збір", коли ми можемо просто запитати, що відбувається з структурами даних взагалі. Структура даних займає частину пам'яті і має деякі операції , які можуть отримати доступ до цієї пам'яті і які можуть бути викликані з допомогою користувачів . Ці користувачі можуть бути окремими процесорами або просто різними потоками, це нас не стосується. Важливо лише те, що вони можуть виконувати операції паралельно.
Без блокування . Герліхій та Бос кажуть, що структура даних не заблокована, коли користувач, що виходить з ладу, не перешкоджає подальшому використанню структури даних. Наприклад, уявіть, що один виливає воду на процесор, який знаходиться посеред вставлення вузла в відсортований набір. Ну а якщо інші процесори спробують пізніше вставити в цей сортований набір, вони мають досягти успіху. ( Редагувати: Відповідно до цього визначення, так буває, що якщо структура даних використовує блокування, то вона не є безблоковою, але це не так, якщо структура даних не використовує блокування, то вона заблокована.)
З огляду на це визначення, я думаю, що Герліхій і Бос в основному кажуть, що відповідь полягає в тому, щоб перетворити критичні регіони на транзакції.
Але, можете запитати, чи має це однакова складність? Я не впевнений, що питання має сенс. Розглянемо push(x) { lock(); stack[size++] = x; unlock(); }
. Це постійна операція в часі? Якщо ви ігноруєте операцію блокування та, отже, інші користувачі, то можете відповісти ТАК. Якщо ви не хочете ігнорувати інших користувачів, то дійсно немає можливості сказати, чи буде натискання працювати постійно. Якщо ви перейдете на один рівень вгору і побачите, як стек використовується в якомусь конкретному алгоритмі, то, можливо, ви зможете сказати, що натискання завжди займе постійний час (вимірюється зараз з точки зору того, що станеться входом вашого паралельного алгоритму). Але це справді властивість вашого алгоритму, тому не має сенсу говорити, що push - це постійна операція в часі.
Якщо підсумовувати, якщо ви ігноруєте, скільки користувач, який виконує операцію, чекає інших користувачів, то використання транзакцій замість критичних регіонів відповідає на ваше запитання ствердно. Якщо ви не ігноруєте час очікування, то вам слід переглянути, як використовується структура даних.