Указатель опасности: получить локальный указатель - PullRequest
0 голосов
/ 05 июля 2019

Это алгоритм « указатель опасности », алгоритм без блокировки в многопоточных средах.

Алгоритм указателя опасности работает следующим образом:

  1. сохранить глобальный указатель на локальный указатель.
  2. поместить локальный указатель в список указателей опасности, чтобы показать, что другие могутне вернуть его.

Я столкнулся с проблемой: как мы можем убедиться, что глобальный указатель не восстановлен до шага 2?

void *local_p = global_p;
put_local_p_to_hazard_list(local_p);

Перед вызовом put_local_p_to_hazard_list(), local_p может быть исправлено;как я могу избежать этого?

1 Ответ

0 голосов
/ 05 июля 2019

ответ должен быть перепроверен после того, как мы добавим его в список опасных точек моего владельца.Вот простой пример.если вы найдете ошибки, пожалуйста, дайте мне знать.(похоже, есть ошибки, пожалуйста, смотрите комментарии)

hazard_pointer * hp = acquire_hazard_pointer();
void* local_p;
do {
  local_p = global_p;
  hp->ptr = local_p;
  __asm__ volatile("mfence" ::: "memory");  // prevent the `while` executed before the `hp = local_p`;
} while ( local_p != global_p );

read_local_p(local_p);
...

...