Ik heb een mooie collectie mega-obscure racedonditions weten te verzamelen in m'n kleine appje wat ik aan het schrijven ben. Schijnbaar is mij iets verkeerd aangeleerd. 
Stukje code voor beeldvorming. Ik heb in thread nummero 1:
en in thread nummero 2/3/4/etc:
csp is hier een gedeelde struct tussen meerdere sudokus. Meerdere sudokus worden tegelijk uitgeprobeerd en zodra een oplossing wordt gevonden probeert deze thread hem weg te schrijven. Maar je raad het al, een van de problemen welke zich de kop op doet is dus dat er "No solution" verschijnt.
Wat blijkt nu, de man page van pthread_mutex_unlock zegt:
Dus mijn vraag is nu, hoe herschrijf ik dit? Is er een mutex waar ik dit wel mee mag doen en/of ander magic thingy?
Ik heb ergens anders ook nog een mutex waar meerdere threads op locken, en als er data beschikbaar is wordt deze unlocked, zodat er een thread wordt 'losgelaten'. Zo'n queue mechanisme gaat dus ook problemen leveren (aantal unlocks is vrijwel gegarandeerd meer per thread dan het aantal locks hier).

Stukje code voor beeldvorming. Ik heb in thread nummero 1:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| /* in init ergens... */ pthread_mutex_init(&curCSP->solved, NULL); pthread_mutex_lock(&curCSP->solved); pthread_mutex_init(&curCSP->writesolved, NULL); curCSP->solution = NULL; /* ...en dan later... */ /* Wait for solution */ pthread_mutex_lock(&curCSP->solved); #ifdef DEBUG if(curCSP->solution) debugsudoku(curCSP->solution); else fprintf(stderr, "No solution\n"); #endif |
en in thread nummero 2/3/4/etc:
C:
1
2
3
4
5
6
7
8
9
| pthread_mutex_lock(&newsudoku->csp->writesolved); /* Sanity check */ if(!newsudoku->csp->solution) newsudoku->csp->solution = newsudoku; else free(newsudoku); /* Let output writer know */ pthread_mutex_unlock(&newsudoku->csp->solved); pthread_mutex_unlock(&newsudoku->csp->writesolved); |
csp is hier een gedeelde struct tussen meerdere sudokus. Meerdere sudokus worden tegelijk uitgeprobeerd en zodra een oplossing wordt gevonden probeert deze thread hem weg te schrijven. Maar je raad het al, een van de problemen welke zich de kop op doet is dus dat er "No solution" verschijnt.

Wat blijkt nu, de man page van pthread_mutex_unlock zegt:
Niemand had mij ooit verteld dat je alleen mag unlocken in dezelfde thread. En dit geeft royaal onvoorspelbaar gedrag, want het lijkt erop dat ongerelateerde locks worden unlocked in plaats van degene die ik probeerde te unlocken.pthread_mutex_unlock() will fail if:
[EINVAL] The value specified by mutex is invalid.
[EPERM] The current thread does not hold a lock on mutex.
Dus mijn vraag is nu, hoe herschrijf ik dit? Is er een mutex waar ik dit wel mee mag doen en/of ander magic thingy?
Ik heb ergens anders ook nog een mutex waar meerdere threads op locken, en als er data beschikbaar is wordt deze unlocked, zodat er een thread wordt 'losgelaten'. Zo'n queue mechanisme gaat dus ook problemen leveren (aantal unlocks is vrijwel gegarandeerd meer per thread dan het aantal locks hier).