Ik heb er nu lang genoeg mee zitten stoeien, ik kom er niet uit..
zoals wel meerdere hier op GoT ben ik bezig met een programma voor Programming Contest Nieuwe Stijl: Contest 4
Ik heb echter een probleem dat niet direct met de contest zelf te maken heeft, dus ik hoop dat jullie mij kunnen helpen
Het idee is dat de main thread enkele worker-threads start.
Als er dan werk is, dan word er een signal gebroadcast waardoor de workers kunnen gaan vechten om de data te verwerken.
Het probleem is echter dat er steeds maar 1 thread reageert op het signal.. Ik heb de betreffende calls wat info laten printen voor de duidelijkheid.
Hier zie je dat er 10 threads gemaakt worden en dat ze elk staan te wachten op een signal ( 0x8051560 )
Het tweede adres wat geprint wordt geeft aan welke mutex er gebruikt wordt.
Hier geeft de main thread de opdracht om werk te gaan verzetten.
Je kan zien dat het juiste signal, namelijk 0x8051560 gebroadcast wordt. ( pthread_cond_broadcast )
Daarna gaat de main thread wachten tot er een signal komt die aangeeft dat de workers klaar zijn.
Hier zie je de eerste thread, namelijk die met het laagste mutex adres, 0x9f84008, het signal ontvangt.
Deze gaat vervolgens aan de slag totdat ie klaar is en weer opnieuw op een signal gaat staan wachten.
Zoals je ziet gaat dit zo verder. De negen andere threads worden dus nooit aangetrapt!
opsomming in pseudo code:
Het hele systeem werkt zoals verwacht, met als uitzondering dat er dus maar 1 thread gebruikt wordt, waardoor het hele idee een beetje teniet gedaan wordt.
Als iemand enig idee heeft waarom er maar 1 thread gebruikt wordt, hoor ik het graag
Voor wie het intereseert, ik test deze code op een MBP 5.1 met Ubuntu 8.10
zoals wel meerdere hier op GoT ben ik bezig met een programma voor Programming Contest Nieuwe Stijl: Contest 4
Ik heb echter een probleem dat niet direct met de contest zelf te maken heeft, dus ik hoop dat jullie mij kunnen helpen
Het idee is dat de main thread enkele worker-threads start.
Als er dan werk is, dan word er een signal gebroadcast waardoor de workers kunnen gaan vechten om de data te verwerken.
Het probleem is echter dat er steeds maar 1 thread reageert op het signal.. Ik heb de betreffende calls wat info laten printen voor de duidelijkheid.
void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f84038 void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f84008 void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f84050 void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f840c8 void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f84068 void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f84080 void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f84098 void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f840b0 void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f84020 void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f840e0
Hier zie je dat er 10 threads gemaakt worden en dat ze elk staan te wachten op een signal ( 0x8051560 )
Het tweede adres wat geprint wordt geeft aan welke mutex er gebruikt wordt.
size_t JobList::run():202 Broadcas signal sent 0x8051560 size_t JobList::run():217 Wait for signal 0x80515a0 0x8051534
Hier geeft de main thread de opdracht om werk te gaan verzetten.
Je kan zien dat het juiste signal, namelijk 0x8051560 gebroadcast wordt. ( pthread_cond_broadcast )
Daarna gaat de main thread wachten tot er een signal komt die aangeeft dat de workers klaar zijn.
void* handleJobs(void*):89 Signal received 0x8051560 0x9f84008 void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f84008
Hier zie je de eerste thread, namelijk die met het laagste mutex adres, 0x9f84008, het signal ontvangt.
Deze gaat vervolgens aan de slag totdat ie klaar is en weer opnieuw op een signal gaat staan wachten.
size_t JobList::run():217 Signal received 0x80515a0 0x8051534 size_t JobList::run():202 Broadcas signal sent 0x8051560 size_t JobList::run():217 Wait for signal 0x80515a0 0x8051534 void* handleJobs(void*):89 Signal received 0x8051560 0x9f84008 void* handleJobs(void*):89 Wait for signal 0x8051560 0x9f84008 size_t JobList::run():217 Signal received 0x80515a0 0x8051534 size_t JobList::run():202 Broadcas signal sent 0x8051560
Zoals je ziet gaat dit zo verder. De negen andere threads worden dus nooit aangetrapt!
opsomming in pseudo code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| thread { while(running) { wacht op signal A doe iets met data stuur signal B } } main { creëer enkele threads prepareer data stuur signal A wacht op signal B } |
Het hele systeem werkt zoals verwacht, met als uitzondering dat er dus maar 1 thread gebruikt wordt, waardoor het hele idee een beetje teniet gedaan wordt.
Als iemand enig idee heeft waarom er maar 1 thread gebruikt wordt, hoor ik het graag
Voor wie het intereseert, ik test deze code op een MBP 5.1 met Ubuntu 8.10
oprecht vertrouwen wordt nooit geschaad