Разница между поточным и асинхронным сигналом - PullRequest
7 голосов
/ 23 марта 2012

В соответствии с APUE 2e, глава 12.5:

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

Мои вопросы

Q1:

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

Q2:

Безопасность потока не подразумевает безопасность асинхронного сигнала, что очевидно.Но означает ли безопасность асинхронного сигнала безопасность потоков?Я много гуглил, люди говорят, что это так, но я не могу найти источник для этого.

Q3:

Если ответы на вопросы Q1 и Q2 положительные, я думаю, что общиеповторный вход просто равен безопасному асинхронному сигналу?

1 Ответ

8 голосов
/ 13 апреля 2013

Q1: безопасный асинхронный сигнал - самая сильная концепция повторного входа.Это требует очень бережного использования ресурсов и сложным в управлении в кроссплатформенном коде приложения.

Q2: безопасность асинхронного сигнала подразумевает поточную безопасность.Потокобезопасный означает, что можно попробовать вызвать функцию дважды, но из разных потоков;Безопасный асинхронный сигнал сильнее, потому что два вызова функции могут быть в одном потоке.Это усложняет ситуацию, поскольку вы не можете просто ждать, пока другой вызов функции освободит свои блокировки, второй вызов внутри обработчика сигнала должен прервать первый, даже если общие ресурсы находятся в несогласованном состоянии., а затем восстановить вещи, когда он выходит.В принципе невозможно использовать общие ресурсы / состояние из обработчика сигналов: всегда используйте «самодостаточный прием», если вы действительно не знаете, как работают обработчики сигналов и у вас есть неясные причины для написания безумного кода.люди могут использовать реентерабельность, чтобы означать просто потокобезопасный.Обработчики сигналов Unix - единственное распространенное место, где требуется что-то более сильное, и это немного неясно, потому что вы не должны пытаться делать что-то умное там.

...