Chcę utworzyć n procesów działających równolegle i mieć je zablokować mutex, inkrementacja licznika, a następnie odblokować i wyjść.procs, fork() i mutexes
Oto mój kod:
#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <unistd.h>
#include <pthread.h>
pthread_mutex_t mutex;
int main(int argc, char **argv) {
if (argc != 2)
return 0;
int n = atoi(argv[1]);
int i = 0;
int status = 0;
pthread_mutex_init(&mutex, NULL);
pid_t pid = 1;
static int *x;
x = mmap(NULL, sizeof *x, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
*x = 0;
printf("Creating %d children\n", n);
for(i = 0; i < n; i++) {
if (pid != 0)
pid = fork();
}
if (pid == 0) {
pthread_mutex_lock(&mutex);
*x = *x + 1;
printf("[CHLD] PID: %d PPID: %d X: %d\n", getpid(), getppid(), *x);
pthread_mutex_unlock(&mutex);
exit(0);
}
wait(&status);
printf("[PRNT] PID: %d X: %d\n", getpid(), *x);
munmap(x, sizeof *x);
return 0;
}
./procs 10000 jednak nie wraca z x = 10000 Myślę, że to dlatego, że mutex nie jest dzielone między procesami, ale co to jest poprawny sposób udostępniać muteks?
Myślę, że łatwiej będzie użyć semafora podczas przechodzenia między programami za pomocą 'fork()'. Zobacz http://man7.org/linux/man-pages/man7/sem_overview.7.html i zobacz http://stackoverflow.com/questions/6477525/interprocess-mutex-with-pthreads – goji
i rodzaju chcesz użyć mutex, ponieważ chcę zaimplementować wersję gwintowaną, która używa tego samego muteksu również. – user1743798
Może używać semafora również w wątkach, ale oczywiście muteksy lepiej pasują. Zrobiłem przykład użycia semafora, jeśli jesteś zainteresowany. sprawdź tutaj: http://codepad.org/m1I9753u link z -pthread – goji