Programmbereich atomar machen

26/09/2008 - 11:33 von Markus Wichmann | Report spam
Hi all,

ich versuche immer, so gut es eben geht, meine Lösungen selbst zu
schreiben. Darum benutze ich keine pthreads, sondern fork(), also kein
Multithreading sondern Multiprocessing. Nun kam ich aber nicht um das
Problem des Lockings herum: Wie kann ich eine Variable locken? Momentan
habe ich folgenden Code:

#include <stdbool.h>
#include <stdio.h>
#include <unistd.h>

static volatile bool locked = false;
static volatile int i;

/* volatile because multiple processes are using them */

int fn()
{
while (locked) usleep(100000); /* not to fry the CPU */
locked = true;
for (i = 0; i!= 4; i++)
{
printf("%d ", i);
}
locked = false;
putc('', stdout);
return 0;
}

int main()
{
int status;
pid_t pid = fork();
if (pid < 0)
{
perror("fork failed");
return 1;
} else if (!pid)
{
return fn();
}
while (locked) usleep(100000);
locked = true;
for (i = 4; i != 0; i--)
{
printf("%d ", i);
}
locked = false;
putc('', stdout);
do {
waitpid(pid, &status, 0);
} while (!WIFEXITED(status));
return 0;
}

Das ist jetzt nur ein sehr kleines Beispiel, und Multiprocessing ist für
das Problem sicherlich overkill, aber es geht mir ums Prinzip: Wie sorge
ich dafür, dass mein Code nicht zwischen der while-Schleife und der
Zuweisung unterbrochen wird? Oder wie sollte ich das Problem das
variable lockings sonst lösen? (Wie schon gesagt: Möglichst ohne
libpthreads. Am besten POSIX-portabel, also keine futexes). Ach ja: Die
Schleifenbedingungen zu veràndern, gilt nicht! :-) Es geht hier ums
Locking, nicht um Code-Styling. (Zugegeben, diese loops _sind_ nicht
optimal, aber darum geht es jetzt mal nicht.)

TIA und Tschö,
Markus
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.
 

Lesen sie die antworten

#1 Sebastian Biallas
26/09/2008 - 12:07 | Warnen spam
Markus Wichmann wrote:
Hi all,

ich versuche immer, so gut es eben geht, meine Lösungen selbst zu
schreiben. Darum benutze ich keine pthreads, sondern fork(), also kein
Multithreading sondern Multiprocessing. Nun kam ich aber nicht um das
Problem des Lockings herum: Wie kann ich eine Variable locken? Momentan
habe ich folgenden Code:

#include <stdbool.h>
#include <stdio.h>
#include <unistd.h>

static volatile bool locked = false;
static volatile int i;

/* volatile because multiple processes are using them */



Äh, Du hast keine Ahnung, wie fork() funktioniert, oder? Nach dem Fork
haben beide Prozesse eigene Variablen locked und i.

Wenn beide den gleichen Speicherbereich nutzen sollen, brauchst Du eben
Threads.

Gruß,
Sebastian

Ähnliche fragen