Время жизни семфора с использованием фьютексаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Время жизни семфора с использованием фьютекса

Сообщение Anonymous »

Системный вызов futex обычно используется для реализации семафоров в Linux. Он использует 32-битное значение, и мы можем использовать операции FUTEX_WAIT и FUTEX_WAKE для атомарного (проверить значение и перейти в спящий режим) и (выйти из спящего режима) соответственно.
Однако я столкнулся с загадкой на всю жизнь, если официант уничтожает семафор сразу после того, как он возвращается из режима ожидания. Использование интерфейса POSIX для демонстрационных целей:

Код: Выделить всё

#include 
#include 

void* thread_fun(void* arg)
{
sem_t* sem = (sem_t*)arg;
sem_post(sem);
return NULL;
}

int main()
{
sem_t sem;
sem_init(&sem, 0, 0); // initial value == 0

pthread_t thread;
pthread_create(&thread, NULL, thread_fun, &sem);

sem_wait(&sem);
sem_destroy(&sem);

pthread_join(thread, NULL);
}
Проблема теперь в реализациях sem_wait и sem_post, здесь они сильно упрощены:

Код: Выделить всё

void sem_post(sem_t* sem)
{
atomic_fetch_add(&sem->data, +1); // A
futex_wake(&sem->data); // B
}

void sem_wait(sem_t* sem)
{
int32_t previous = atomic_fetch_add(&sem->data, -1); // C
while(previous data, previous);
previous = atomic_load(&sem->data);
if(previous > 0 && atomic_compare_exchange_weak(&sem->data, &previous, expected + 1))
break;
}
}
Последовательность операций может быть такой:
  • постер выполняет A (atomic_fetch_add +1)
  • официант выполняет C (atomic_fetch_add -1)
  • официант возвращается и уничтожает семафор
  • постер выполняет B (futex_wake )
Кажется, ядро ​​вполне спокойно справляется с этим, если вы вызываете futex_wake в какой-то неотображенной памяти, но мне интересно, какие побочные эффекты вы можете получить при этом этот. Например, если официант создаст еще один семафор в том же месте, вы можете получить ложные пробуждения. Или, если вы поместите в это место другую структуру данных, общую с ядром, я понятия не имею, что может сделать ядро.
Как это реализуется на практике?

Подробнее здесь: https://stackoverflow.com/questions/785 ... sing-futex
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»