 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 19.03.2006, 01:11 Titel: COND-Befehle: Erklärungen demnächst verfügbar |
|
|
Hallo Leute!
Ich habe das englische Wiki durchstöbert, und bin auf eine Erklärung zu den COND-Befehlen (CONDCREATE, CONDDESTROY, CONDWAIT, CONDSIGNAL, CONDBROADCAST) gestoßen.
Hier ein kleines Beispiel, angelehnt an das MUTEX-Beispiel:
Code: | Declare Sub Producer (i As Integer)
Declare Sub Consumer (i As Integer)
Dim Shared As Integer cc, cp
Dim Shared As Integer tc, tp
cc = CondCreate
cp = CondCreate
tc = ThreadCreate(@Consumer)
tp = ThreadCreate(@Producer)
If (cc = 0) Or (cp = 0) Or (tc = 0) Or (tp = 0) Then
? "Fehler: Thread oder Cond konnte nicht generiert werden."
Sleep
End
End If
Sleep 1
CondSignal(cp)
ThreadWait tp
ThreadWait tc
CondDestroy(cc)
CondDestroy(cp)
Sleep
'------------------------------------------------------------------------------'
Sub Producer(x As Integer)
For i = 1 To 10
CondWait(cp)
? "Producer puts"; i,
Sleep 1
CondSignal(cc)
Next
End Sub
Sub Consumer(x As Integer)
For i = 1 To 10
CondWait(cc)
? "Consumer gets"; i
Sleep 1
CondSignal(cp)
Next
End Sub |
Allerdings habe ich noch nicht herausgefunden, wie man mit CONDSIGNAL bestimmt, welchen Thread man freigeben will; im engl. Wiki heißt es nur, dass CONDBROADCAST alle Threads, die auf eine bestimmte COND warten, freigeben.
Übrigens: Der Unterschied zwischen CONDs und MUTEXen ist dieser: Wird ein MUTEX entsperrt, muss der wartende Thread noch nicht einmal beim entsprechenden Zugriff auf den gerade entsperrten MUTEX angekommen sein, damit das MUTEXUNLOCK seine Wirkung zeigt.
Das CONDSIGNAL zeigt seine Wirkung nur dann, wenn der wartende Thread auch wirklich gerade an CONDWAIT ist.
Am aktuellen beispiel:
Der Thread 'Producer' setzt gerade sein CONDSIGNAL ab. Zu diesem Zeitpunkt, da das Signal abgesetzt wird, ist 'Consumer' aber noch mit der PRINT-Zeile beschäftigt. Das Signal kann also nicht empfangen werden, es wird gewartet, bis ein neues CONDSIGNAL abgegeben wird (was hier nie der Fall wäre). Um zu vermeiden, dass das Signal nicht aufgenommen werden kann, sind hier die drei SLEEP 1 eingebaut; wie ihr bestimmt wisst, funktionieren sie so wie ein DoEvents in VB. Es wird also so lange gewartet, bis alle Threads bei CONDWAIT angekommen sind, so dass das CONDSIGNAL empfangen werden kann.
Wer genaueres zum Unterschied zwischen BROADCAST und SIGNAL weiß, soll sich bitte bei mir melden!
Ansonsten versuche ich, noch heute alle Erklärungen so weit möglich zu schreiben und zu veröffentlichen. Dazu zählt auch die CHM.
Have a nice day
Ciao
//EDIT:
Habe grade die Updates zusammengepackt.
Download CHM:
http://mitglied.lycos.de/siteofkaos/myfiles/freeBASIC/FB-Ref-German-19-03-2006.chm
Download HTML/ZIP:
http://mitglied.lycos.de/siteofkaos/myfiles/freeBASIC/Referenz_HTML.zip
Ich hoffe, die Downloads klappen, wenn nicht wartet ein paar Tage, bis alles bei Mecki ist. _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 19.03.2006, 04:01 Titel: |
|
|
ich würde mal tippen, condsignal restartet immer den thread, der schon am längsten wartet.. hab die neue version zum testen nich installiert, mach ich erst mit stable, von daher kann ichs nich ausprobieren, aber so würd ich das jetzt erwarten.. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
d.j.peters Gast
|
Verfasst am: 22.03.2006, 07:42 Titel: |
|
|
Ohne es probiert zu haben (werde ich aber gleich mal) sind Conditions zum Synkrohnisieren von Threads und Mutexe zum "Blockem" von globalen Resourcen.
Wobei mir nicht klar ist ob ein Thread der "nur" durch einen Mutex geblockt wurde wirklich im Sleepmodus keine CPU-Zeit benötigt was bei ConditionWait auf jeden Fall so ist.
Ich probier es mal.
Grüsse Joshy |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|