Является ли mq_send атомарным?
-
10-07-2019 - |
Вопрос
Кто-нибудь может мне сказать, что произойдет, если многопоточная программа получит сигнал SIGSTOP во время выполнения mq_send? Р>
Решение
Страница man для mq_send
указывает, что она реализована поверх mq_timedsend
, который является системным вызовом в Linux. Системные вызовы, как правило, являются атомарными в том смысле, что они либо успешны, либо нет. Если системный вызов прерывается сигналом, обычное поведение - вернуть -1 и установить для errno
значение EINTR
. Похоже, mq_send
имеет такое поведение.
Как правило, вы должны проверить наличие EINTR
и повторить вызов, если он не пройдет таким образом. Это особенно важно для системных вызовов, которые могут блокировать, например, recv
или select
, поскольку у них больше шансов быть прерванными.