Взаимное исключение в общей памяти, когда один пользователь отказывает?

Бросок для возражения в методе перегрузки:

public static bool operator ==(Foo foo1, Foo foo2) {
    if ((object) foo1 == null) return (object) foo2 == null;
    return foo1.Equals(foo2);
}
15
задан Zan Lynx 2 December 2011 в 17:27
поделиться

4 ответа

Если вы работаете в Linux или чем-то подобном, подумайте об использовании именованных семафоров вместо (как я предполагаю) мьютексов pthreads. Я не думаю, что есть способ определить блокирующий PID мьютекса pthreads, за исключением создания вашей собственной таблицы регистрации и помещения ее в общую память.

9
ответ дан 1 December 2019 в 00:29
поделиться

Следует использовать семафор, предоставляемый операционной системой.

Операционная система освобождает все ресурсы, открытые для процесса, независимо от того, завершается он или завершается корректно.

1
ответ дан 1 December 2019 в 00:29
поделиться

Я оставил этот НЕПРАВИЛЬНЫЙ пост восстановленным, только если у кого-то возникнет такая же идея и он найдет это обсуждение использования!


Вы можете использовать этот подход. 1) Заблокируйте общий мьютекс POSIX 2) Сохраните идентификатор процесса в общей памяти. 3) Разблокировать общий мьютекс 4) При правильном выходе очистите идентификатор процесса

. Если процесс выполняет резервное копирование, следующий процесс обнаружит, что в общей памяти на шаге № 2 сохранен идентификатор процесса. Если в ОС нет процесса с этим идентификатором процесса, то общий мьютекс никому не принадлежит. Так что просто необходимо заменить идентификатор процесса.

Обновить, чтобы ответить на комментарий:

Сценарий 1: 1. P1 запускается 2. P1 создает / открывает именованный мьютекс, если он не существует. 3. P1 timed_locks названный мьютекс и успешно делает это (при необходимости ждет 10 секунд); 4. Насосы с сердечником P1 5. P2 запускается после откачки ядра 6. P2 создает / открывает именованный мьютекс, он существует, все в порядке 7. P2 timed_locks названный мьютекс и не может заблокировать (при необходимости ждет 10 секунд); 8. P2 удалить названный мьютекс. 9. P2 воссоздает именованный мьютекс и заблокирует его

1
ответ дан 1 December 2019 в 00:29
поделиться

Как насчет блокировки на основе файлов (с использованием flock (2) )? Они автоматически освобождаются, когда процесс, в котором он находится, умирает.

Демонстрационная программа:

#include <stdio.h>
#include <time.h>
#include <sys/file.h>

void main() {
  FILE * f = fopen("testfile", "w+");

  printf("pid=%u time=%u Getting lock\n", getpid(), time(NULL));
  flock(fileno(f), LOCK_EX);
  printf("pid=%u time=%u Got lock\n", getpid(), time(NULL));

  sleep(5);
  printf("pid=%u time=%u Crashing\n", getpid(), time(NULL));
  *(int *)NULL = 1;
}

Вывод (я немного усек PID и время для ясности):

$ ./a.out & sleep 2 ; ./a.out 
[1] 15
pid=15 time=137 Getting lock
pid=15 time=137 Got lock
pid=17 time=139 Getting lock
pid=15 time=142 Crashing
pid=17 time=142 Got lock
pid=17 time=147 Crashing
[1]+  Segmentation fault      ./a.out
Segmentation fault

Что происходит, так это то, что первая программа получает блокировку и начинает спать на 5 секунд. Через 2 секунды запускается второй экземпляр программы, который блокируется при попытке получить блокировку. Через 3 секунды первая программа выходит из строя (хотя bash сообщает об этом позже), и сразу же вторая программа получает блокировку и продолжает работу.

5
ответ дан 1 December 2019 в 00:29
поделиться