Article View: pl.comp.os.linux.programowanie
Article #390Re: Qt, X-Window - wątki
From: Andrzej Radecki
Date: Wed, 15 Sep 1999 14:55
Date: Wed, 15 Sep 1999 14:55
62 lines
3823 bytes
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!radeckiReferences:
<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