_ RU.UNIX (2:5077/15.22) _____________________________________________ RU.UNIX _
From : Vladimir A. Butenko 2:5020/400 05 Oct 98 18:19:44
Subj : Re: Алтернатива alert() в UNIX?
________________________________________________________________________________
From: butenko@stalker.com (Vladimir A. Butenko)
In article <m2hfxjfw7d.fsf@xtalk.msk.su>, Boris Tobotras
<Boris.Tobotras@f510.n5020.z2.fidonet.org> wrote:
> >>>>> "Vladimir" == Vladimir A Butenko writes:
>
> Vladimir> Классный программист еще и заджойнит этот тред при закрывании
> Vladimir> библиотеки. Умный программист этого делать никогда не будет (ну,
> Vladimir> на Солярисе может, и будет - и то ... :-)
>
> Вот поделились бы разумом :) Почему не джойнить-то?
"Джойнт, Петька, дело ответственное", сказал он, скручивая его с особой любовью.
а) во-первых, надо убедиться, что в момент, когда вызывается pthread_join,
или как он там - то активным является именно тот тред, который исходно
породил служебный тред. Это - в любом случае. Заметим, что ежели мы пишем
библиотеку,
то никто не гарантировал, что не найдется этакий хитроушлый фидошник,
который уже прознал про треды, и инциировать нашу библиотеку будет в одном
треде (главном, но не факт), а убивать-закрывать - в каком-нибудь треде,
который собственно и реализует коммуникационные сессии и крутится где-то
сбоку. То есть руки ему надо было бы, конечно, поотрывать - но руки его
далеко, и из библиотеки ну никак не доступны. Посему - "ответственное это
дело". Хотя бы в статике спасти ID своего треда, когда порождали, и при
закрытии библиотеки - сравнить с ID текущего. И попытаться найти домашний
адрес вызывающего, если IDы не совпадают.
б) в отличие от Форточек и Соляриса - во всех остальных системах треды
появились позже самой системы. Очень сильно повезло тем системам, в
которых реализатор тредов хоть раз в жизни написал хоть что-то, их
использующее. Hо еще больше повезло тем системам, в которых реализатор не
только в своем 20-строчном тесте сподобился породить эти треды, но еще и
заджойнить их, породить опять, и так далее. Hу вот, в результате, в Линухе
(5.1) после каждого порождения/убивания 16 байтиков откладываются в
закрома Родины. Причем где откладываются - тоже большой секрет для всех.
Про новый ФриБСД - не скажу, не делал я тестов - ибо будучи программистом
не классным, но ленивым, к тредам старался подходить по-буддийски, и не
убивал братьев наших младших.
Вообще-то самое интересное происходит в тех системах, где p-threads не
являются системной имплементацией, но в системе есть свои супер-дупер
треды, а p-threadы прикручены сверху, просто как интерфейс. Вроде как в
Солярисе и только - это сделано на совесть (которая позволила разработать
остальной Солярис, правда). Вот в Махе с БСДей сверху хоть и не p-threads,
а c-threads, но все равно забавны: по тому, удавался ли cthread_join или
зависал - можно было определять число осадков выпадающих в это время в
МиллВаллевском офисе. Или наоборот - сидя в Милл Валли - определять,
какова высота снежного покрова в Москве. По числу прошедших тестов.
Короче: темное это дело. Можно делать только на тех системах, на которых
хорошо и долго тестировали. Hа Форточках и Солярисе - можно. Hа Линухе -
точно не рекомендуется. Hа FreeBSD 3.0 - ничего сказать не могу. Остальные
хрен с ними - вопрос был о переносимом решении на Солярис/Линух/Фрю -
отсюда следует и ответ: лучше не джойнтить. Hо можно и джойнить -
проверив. Hо лучше - нет, лучше пивка попить. А еще лучше - коньячку.
> --
> Best regards, -- Boris.
--
Vladimir Butenko
Stalker Software, Inc.
--- ifmail v.2.14dev2
* Origin: Stalker Software, Inc. (2:5020/400@fidonet)