Oh tut mir leid (wenn man so in Gedanken ist, vergisst man immer, dass ihr ja nicht alles habt wie ich :3).
Also Ausgangspunkt:
Wir sollen mit pthreads eine Simulation bauen. (von Autos die über die Brücke fahren aber immer einzeln)
Im Code sollen wir noch ohne Hardware oder Betriebssystem Unterstützung arbeiten, um kritische Abschnitte zu bearbeiten.
Die Threads generieren sich ganz normal,
hier die lock und unlock Methoden, für den kritischen Abschnitt:
int lock (long tid) {
int i, max = 0;
enter[tid] = 1;
for (i = 0; i < NUM_THREADS; i++) {
if (max < tickets[i])
max = tickets[i];
}
tickets[tid] = max + 1;
enter[tid] = 0;
printf("tid: %ld, my ticket is: %d\n", tid, tickets[tid]);
for (i = 0; i < NUM_THREADS; i++) {
if (i != tid) {
while (enter[i])
;
while((tickets[i] != 0) && ((tickets[tid] > tickets[i]) || ((tickets[tid] == tickets[i])&&(tid > i))))
{
printf("thread waiting\n");//ohne das geht es nicht O.o
}
}
}
return 0;
}
int unlock (long tid) {
printf("tid: %ld, unlocked \n", tid);
tickets[tid] = 0;
return 0;
}
Alles anzeigen
Die Endlosschleifen sind wichtig, da die Threads während des kritischen Abschnittes nichts tun dürfen, da es sonst zu Fehlern kommt.(2 Autos auf der Brücke)
Das "random Semikolon" ist doch dafür, dass die Endlosschleife funktioniert oder nicht? Wie schreibt man das sonst besser?
So nun das Problem:
Wenn ich das
entferne, kommt es zu einem Deadlock. Warum weiß ich aber nicht.
(es ergibt für mich auch keinen Sinn)
Kaliber (Wieso ist der Code maximal dirty? Wie schreibt man das besser?)