🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.os.linux.programowanie
Article #390

Re: Qt, X-Window - wątki

#390
From: Andrzej Radecki
Date: Wed, 15 Sep 1999 14:55
62 lines
3823 bytes
Łukasz Kowalczyk <smithy@promail.pl> pisze:
>Kiedyś  wyczytałem gdzieś (możliwe, że w dokumentacji do Qt), że pod X nie
>można pisać programów wielowątkowych.

Nieprawda.

>Jeżeli dobrze pamiętam, miało to jakiś związek z globalną zmienną errno.

M.in.

>Na  razie jedynym znanym mi sposobem pisania programów wielowątkowych w Qt
>jest symulowanie wątków wydarzeniami  generowanymi  przez  setTimer(),  co
>wygląda naprawdę idiotycznie.

Największym  problemem  związanym  z używaniem wątków jest to, że większość
bibliotek  jest  "non-reentrant".  Oznacza  to,  że  nie  możesz  wywoływać
jednocześnie  jakichś tam funkcji z biblioteki z kilku wątków jednocześnie.
Nie wiem jak jest z Qt ale np. GTK jest właśnie taką  biblioteką  z  której
może  korzystać  tylko  jeden wątek. Jak sami się (chyba słusznie) tłumaczą
nakład pracy potrzebnej do uczynienia  biblioteki  "reentrant"  byłby  nie­
współmierny  do efektów zwłaszcza, że można poradzić sobie bez tego. Są dwa
(a może więcej) rozwiązania tego problemu:

1.  Zlecasz  jednemu  (głównemu?)  wątkowi  realizację wszelkich odwołań do
funkcji bibliotecznych. W wątkach zamiast  wywołania  funkcji  przekazujesz
odpowiednie  dane  głównemu  procesowi  i czekasz aż ten zrobi co powinien.
Dobrze jest tu wykorzystać jakiś systemowy mechanizm synchronizacji  (mute­
xy,  rurkę  itp.)  tak  aby  proces czekając na wynik oddawał sterowanie do
systemu.

2.  "Okładasz" funkcje biblioteczne, z których będziesz w wątkach korzystał
semaforami. Tworzysz w ten sposób  własne  bezpieczne  funkcje  i  _zawsze_
używasz  tylko nich. Musisz uważać na inne funkcje biblioteczne, które mogą
się odwoływać funkcji, których używasz w wątkach - je  też  musisz  obłożyć
semaforami.  (chociaż  tu  nie  jestem  pewien - może  okazać się konieczne
"obłożenie" semaforem wszystkich funkcji w bibliotece.. Brr..)

Jeśli  postąpisz wg. jednej z tych metod to nie ma przeszkód aby nie używać
wątków. Musisz tylko bardzo uważać na to jakie funkcje  wywołujesz  bo  jak
sknocisz to będzie się sypało aż miło. Ogólnie jeśli chcesz w wątku wywołać
jedną lub dwie charakterystyczne funkcje biblioteczne (tj. takie które  nie
są  używane  w  każdej innej gunkcji bibliotecznej) to skorzystaj z drugiej
opcji - jeśli tych funkcji jest dużo lub używa ich wiele innych funkcji  to
lepiej użyj metody pierwszej.

Jeśli  chcesz się dowiedzieć w ilu miejscach biblioteki jest wykorzystywana
dana funkcja możesz zdisassemblować tą bibliotekę moim programikiem:

http://www.wpk.p.lodz.pl/~radecki/disasm.tar.gz

Nie  zadziała  on  niestety dla funkcji wirtualnych - pokaże 0 odwołań. Ale
taki jest urok funkcji wirtualnych (i zmiennych dynamicznych też).

Co  do  wpomnianej zmiennej "errno". Akurat glibc ma możliwość przełączenia
się w tryb pracy "wielodostępnej".  W  tym  celu  możesz  skompilować  swój
program z "-D_REENTRANT" i używać funkcji glibca ile chcesz i gdzie chcesz.

Pozdrawiam,
-- 
(    /6/  Andrzej Radecki
 ====  \  radecki@wpk.p.lodz.pl
/   |     http://www.wpk.p.lodz.pl/~radecki
Technical Details
Message-ID: <slrn7tvcrs.ba.radecki@radek.localdomain>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!radek.localdomain!radecki
References: <slrn7tquks.3nj.smithy@hoohoo.org>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!radek.localdomain!radecki
From: radecki@wpk.p.lodz.pl (Andrzej Radecki)
Newsgroups: pl.comp.os.linux.programowanie
Subject: Re: Qt, X-Window - wątki
Date: 15 Sep 1999 14:55:59 GMT
Organization: home
Lines: 62
Message-ID: <slrn7tvcrs.ba.radecki@radek.localdomain>
References: <slrn7tquks.3nj.smithy@hoohoo.org>
NNTP-Posting-Host: pa206.lodz.ppp.tpnet.pl
Mime-Version: 1.0
User-Agent: slrn/0.9.5.7 (UNIX)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit