Бросок для возражения в методе перегрузки:
public static bool operator ==(Foo foo1, Foo foo2) {
if ((object) foo1 == null) return (object) foo2 == null;
return foo1.Equals(foo2);
}
Если вы работаете в Linux или чем-то подобном, подумайте об использовании именованных семафоров вместо (как я предполагаю) мьютексов pthreads. Я не думаю, что есть способ определить блокирующий PID мьютекса pthreads, за исключением создания вашей собственной таблицы регистрации и помещения ее в общую память.
Следует использовать семафор, предоставляемый операционной системой.
Операционная система освобождает все ресурсы, открытые для процесса, независимо от того, завершается он или завершается корректно.
Я оставил этот НЕПРАВИЛЬНЫЙ пост восстановленным, только если у кого-то возникнет такая же идея и он найдет это обсуждение использования!
Вы можете использовать этот подход. 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 воссоздает именованный мьютекс и заблокирует его
Как насчет блокировки на основе файлов (с использованием 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 сообщает об этом позже), и сразу же вторая программа получает блокировку и продолжает работу.