Как должны вести себя точки отмены POSIX?

Я изучал реализацию точек отмены в glibc / nptl и сравнивал ее с POSIX, и, если я не ошибаюсь, это совершенно неверно. Используемая базовая модель:

int oldtype = LIBC_ASYNC_CANCEL(); /* switch to asynchronous cancellation mode */
int result = INLINE_SYSCALL(...);
LIBC_CANCEL_RESET(oldtype);

Согласно POSIX:

Побочные эффекты действия по запросу отмены во время приостановки во время вызова функции такие же, как и побочные эффекты, которые могут наблюдаться в однопоточной программе, когда вызов функции прерывается сигналом. и данная функция возвращает [EINTR]. Любые такие побочные эффекты возникают до того, как будут вызваны какие-либо обработчики очистки отмены.

Я читаю этот отрывок так, что если я вызываю open , я могу ожидать, что он либо будет отменен ( вместе со всем моим потоком), прежде чем он не сможет открыть файл, или , чтобы вернуть действительный дескриптор файла или значение -1 и errno , но никогда не создавать новый дескриптор файла, затем потеряйте это в пустоту. С другой стороны, реализация точек отмены glibc / nptl, кажется, допускает состояние гонки, когда запрос отмены происходит сразу после возврата системного вызова, но до того, как произойдет LIBC_CANCEL_RESET .

Я сумасшедший, или их реализация действительно так сломан? И если да, то допускает ли POSIX такое некорректное поведение (которое, кажется, делает отмену полностью непригодной, если вы не отложите ее вручную), или они просто грубо игнорируют POSIX?

Если это поведение действительно нарушено, как правильно реализовать это без такого состояния гонки?

10
задан R.. 18 November 2010 в 09:18
поделиться