Geregelte Syncronisierung in Thread...?
-
Habe ein Datenobejekt, auf denen die Thread zugreifen sollen/können.
Dabei erstelle ich Thread Objekte....
und starte darin den jeweiligen Thread.nun sollen die Thread immer nacheinandern im kreislauf auf das Datenobjekt zugriefen...Quasie eine Liste von Thread welche immer nacheindern das Datenobjekt für sich nutzen.
Wie kann ich das umsetzen?
-
Kurzanweisung:
Für den Zugriff auf das Datenobjekt kannst du dir eine Methode bzw. Funktion schreiben.
Am Anfang dieser rufst du "EnterCriticalSection" auf und vor dem Verlassen "LeaveCriticalSection".Schau auch bitte mal in der Online Hilfe zu Critialsections nach.
-
#include <windows.h> #include <stdio.h> #include <process.h> #define NUMTHREADS 10 unsigned long threadlist[NUMTHREADS]; int owner = -1; void thread (void *p) { for (;;) { int a = owner; Sleep (1000); if (a == (int)p) { printf ("hello %d\n", p); a++; if (a == NUMTHREADS) a = 0; InterlockedExchange (&owner, a); } } } int main (void) { int s; for (s=0; s<NUMTHREADS; s++) threadlist[s] = _beginthread (thread, 0, (void*)s); owner = 0; Sleep (INFINITE); }
-
@VISTA: was macht die funktion InterlockedExchange genau? sorgt diese dafür das jeder thread nacheinder datenzugriffe bekommt?
-
Lesen: http://msdn2.microsoft.com/en-us/ms683590.aspx
Nein der Code ist nichts anderes als ein trickreiches CriticalSection.
Wobei hier nicht mal garantiert ist, dass alle Threads irgendwann mal an die Reihe kommen. Dieser Code kann zufällig so reagieren, dass ein Thread niemals dran kommt!
-
genau das will ich ja vermeiden.. will das jeder thread nacheindern dran kommt... wenn ein trhead jetzt bspw. zu lange braucht (timmeout) soll einfach zum nächsten thread gewesellt werden.. aber der kreislauf sollte immer gewährleistet sein..
-
Martin Richter schrieb:
Dieser Code kann zufällig so reagieren, dass ein Thread niemals dran kommt!
wieso?
-
vista schrieb:
Martin Richter schrieb:
Dieser Code kann zufällig so reagieren, dass ein Thread niemals dran kommt!
wieso?
Upps! Du hast recht. Er geht wirklich sequentiel jeden Thread durch... Sorry.
-
BorisDieKlinge schrieb:
genau das will ich ja vermeiden.. will das jeder thread nacheindern dran kommt... wenn ein trhead jetzt bspw. zu lange braucht (timmeout) soll einfach zum nächsten thread gewesellt werden.. aber der kreislauf sollte immer gewährleistet sein..
Du hast irgendwie Multithreading nicht verstanden. Ein Thread bleibt stehen wenn er auf eine Ressource warten muss (CriticalSection, WaitForSingleObject) oder wenn seine Zeitscheibe aufgebraucht wird.
Wenn ein Thread eine Ressource blockiert, dann kommt an diese Ressource kein andere dran. Da gibt es kein Timeout, außer dass der Thread gesagt bekommt er bekommt die Ressource nicht nach einem Timeout. Und dann?
BTW: Wenn es immer noch um Dein "DC" Problem und mehere Threads geht, dann bist Du immer noch auf dem Holzweg.
Wie ich es aktuell sehe (und hustbaer offensichtlich auch) benötigst Du kein Multithreading für Dein Problem.
-
Martin Richter schrieb:
Wie ich es aktuell sehe (und hustbaer offensichtlich auch) benötigst Du kein Multithreading für Dein Problem.
windows bietet noch eine andere alternative zur aufteilung von tasks ohne multithreading: http://msdn2.microsoft.com/en-us/library/ms682661.aspx

-
@Martin: Ne hat nich unbedingt was mit der DC zu tun. Ist bisher nur spielerei und Einarbeitung in das Mutithreading verfahren..