Является ли mq_send атомарным? - PullRequest
4 голосов
/ 29 октября 2009

Кто-нибудь может мне сказать, что произойдет, если многопоточная программа получит сигнал SIGSTOP во время выполнения mq_send?

1 Ответ

2 голосов
/ 30 октября 2009

Страница man для mq_send указывает, что она реализована поверх mq_timedsend, который является системным вызовом в Linux. Системные вызовы, как правило, являются атомарными в том смысле, что они либо успешны, либо нет. Если системный вызов прерывается сигналом, обычное поведение - вернуть -1 и установить errno в EINTR. Похоже, что mq_send имеет такое поведение.

Как правило, вы должны проверить EINTR и повторить вызов, если он не пройдет таким образом. Это особенно важно для системных вызовов, которые могут блокироваться как recv или select, так как они имеют более высокий шанс прерывания.

...