Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

COND-Befehle: Erklärungen demnächst verfügbar

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Dusky_Joe



Anmeldungsdatum: 07.01.2005
Beiträge: 1007
Wohnort: Regensburg/Oberpfalz

BeitragVerfasst am: 19.03.2006, 01:11    Titel: COND-Befehle: Erklärungen demnächst verfügbar Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 19.03.2006, 04:01    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
d.j.peters
Gast





BeitragVerfasst am: 22.03.2006, 07:42    Titel: Antworten mit Zitat

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
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz