`nanosleep ()` asyn c - сигнал безопасности на Linux - PullRequest
1 голос
/ 03 апреля 2020

Мне нужно использовать функцию nanosleep в моей библиотеке потоков пользовательского пространства, чтобы достичь ожидаемого приблизительно желаемого количества, поскольку это может сэкономить оставшееся время в случае прерывания асинхронными c сигналами. Я использую SIGALRM для преимущественного переключения потоков; поэтому важно учитывать возможные побочные эффекты использования не реентерабельных функций. По этой причине, в случае, если вызов nanosleep прерывается переключателем потока и он вызывается снова из другого потока или обработчика сигнала, мне интересно, будет ли эта ситуация вызывать проблемы.

Видимо, nanosleep функция не является асинхронной c -сигнал безопасен , поскольку здесь ее нет в списке ; тем не менее, sleep(3) считается безопасным для асинхронного сигнала c. С другой стороны, sleep(3), по-видимому, реализовано с использованием nanosleep на Linux. Могу ли я принять это как доказательство того, что nanosleep безопасен для того, чего я пытаюсь достичь?

РЕДАКТИРОВАТЬ: Согласно этот ресурс , это действительно AS-безопасно.

1 Ответ

1 голос
/ 03 апреля 2020

Нет, вы не можете с уверенностью предположить, что, если это специально не задокументировано. Причина в том, что использование nanosleep является подробностью реализации sleep. Если бы две функции были реорганизованы для использования некоторой общей внутренней функции в glib c, которая была безопасна для asyn c -signal, но реализация nanosleep изменилась так, что это не так, ваш код будет поврежден.

Вы не можете полагаться на детали реализации функций в glib c, поскольку они могут изменяться и изменяются в разных версиях. Примечательно, что все версии Adobe Fla sh не работали на некоторых машинах, потому что glib c изменил memcpy для копирования вместо up, что разрешено стандартом и документацией.

Кроме того, просто потому, что glib c делает вещи определенным образом, это не значит, что другие Linux libcs ​​делают (или другие не Linux libcs), и ваш код там не будет работать.

...