LINUX.ORG.RU

Реентерабельность и асинхронные сигналы


0

0

Стивенс пишет, что если функция реентерабельна, то это не означает, что ее можно вызывать в обработчике асинхронного сигнала. А чем принципиально отличаются эти два случая? По мне так второй частный случай первого.

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

runtime ★★★★
()

Кстати, заметил:

Qt: Hence, a thread-safe function is always reentrant, but a reentrant function is not always thread-safe.

Wiki: Every reentrant function is thread-safe; however, not every thread-safe function is reentrant.

http://doc.trolltech.com/4.6/threads-reentrancy.html

http://en.wikipedia.org/wiki/Reentrant_%28subroutine%29

Кто прав (как я понимаю, Qt) ? Вот и верь после этого интернету :)

runtime ★★★★
()
Ответ на: комментарий от runtime

Цитирую Стивенса

«Если функция является реентерабельной по отношению к потокам, то такая функция называется безопасной в многопоточной среде. Однако, это не говорит о том, что функция реентерабельна по отношению к обработчикам сигналов».

Я тут подумал, если реентербельность по отношению к потокам реализуется за счет какого-нибудь статического мьютекса, то да - она не будет реентерабельна по отношению к сигналам.

placement_new ★★
() автор топика
Ответ на: комментарий от runtime

Документация Qt говорит о реентарабельных классах, Вики - о реентерабельных функциях. Интересно было бы увидеть реентерабельную, но не thread-safe функцию.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Насколько я понимаю, thread-safe функция лочит данные, которые использует, поэтому она реентрантная при вызове из разных потоков как с одними данными, так и с разными. Реентрантная функция данные не лочит, поэтому, ее нельзя вызывать с одними данными одновременно, но с разными можно.

Liosha_Syrnikov
()
Ответ на: комментарий от placement_new

>Цитирую Стивенса

Думаю это связано как минимум с errno. Из-за того, что большинство библиотечных вызовов изменяет глобальную errno, они строго говоря не могут быть реентерабельными. Но так как для каждой нити сделали уникальную errno, то все ОК. На сигналы это не распространяется, так что ты запросто можешь испортить errno в обработчике своего сигнала.

pathfinder ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.