2013-10-04 5 views
7

मैं समानांतर में चल रही एन प्रक्रियाएं बनाना चाहता हूं और उन्हें एक म्यूटेक्स लॉक करना है, काउंटर बढ़ाएं, और फिर अनलॉक करें और बाहर निकलें।procs, कांटा(), और म्यूटेक्स

यहाँ मेरी कोड है:

#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; 
} 

10000 ./procs लेकिन साथ वापस नहीं करता है एक्स = 10000 मुझे लगता है कि इस वजह से म्युटेक्स प्रक्रियाओं के बीच साझा नहीं है, लेकिन क्या करने के लिए सही रास्ता है म्यूटेक्स साझा करें?

+0

मुझे लगता है कि आपको 'फोर्क() 'के साथ इंटरप्रोरिस जाने पर एक सेमफोर का उपयोग करना आसान लगेगा। Http://man7.org/linux/man-pages/man7/sem_overview.7.html देखें और http://stackoverflow.com/questions/6477525/interprocess-mutex-with-pthreads – goji

+0

देखें मैं किस प्रकार का उपयोग करना चाहता हूं एक म्यूटेक्स क्योंकि मैं एक थ्रेड संस्करण को कार्यान्वित करना चाहता हूं जो उसी म्यूटेक्स का उपयोग करता है साथ ही – user1743798

+0

धागे में सेमफोर का भी उपयोग कर सकता है, लेकिन निश्चित रूप से म्यूटेक्स बेहतर फिट बैठते हैं। यदि आप रुचि रखते हैं तो मैंने एक सेमफोर का उपयोग करने का एक उदाहरण दिया है। यहां जांचें: http://codepad.org/m1I9753u -pthread – goji

उत्तर

8

pthread_mutex का उपयोग कर टिप्पणी में मेरे उदाहरण का एक बंदरगाह यहां दिया गया है। पहली बार मैंने यह किया है, लेकिन काम करने लगता है:

#include <stdio.h> 
#include <assert.h> 
#include <unistd.h> 
#include <stdbool.h> 
#include <fcntl.h> 
#include <sys/mman.h> 
#include <pthread.h> 

typedef struct 
{ 
    bool done; 
    pthread_mutex_t mutex; 
} shared_data; 

static shared_data* data = NULL; 

void initialise_shared() 
{ 
    // place our shared data in shared memory 
    int prot = PROT_READ | PROT_WRITE; 
    int flags = MAP_SHARED | MAP_ANONYMOUS; 
    data = mmap(NULL, sizeof(shared_data), prot, flags, -1, 0); 
    assert(data); 

    data->done = false; 

    // initialise mutex so it works properly in shared memory 
    pthread_mutexattr_t attr; 
    pthread_mutexattr_init(&attr); 
    pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); 
    pthread_mutex_init(&data->mutex, &attr); 
} 

void run_child() 
{ 
    while (true) 
    { 
     puts("child waiting. .. "); 
     usleep(500000); 

     pthread_mutex_lock(&data->mutex); 
     if (data->done) { 
      pthread_mutex_unlock(&data->mutex); 
      puts("got done!"); 
      break; 
     } 
     pthread_mutex_unlock(&data->mutex); 
    } 

    puts("child exiting .."); 
} 

void run_parent(pid_t pid) 
{ 
    puts("parent sleeping .."); 
    sleep(2); 

    puts("setting done .."); 
    pthread_mutex_lock(&data->mutex); 
    data->done = true; 
    pthread_mutex_unlock(&data->mutex); 

    waitpid(pid, NULL, NULL); 

    puts("parent exiting .."); 
} 

int main(int argc, char** argv) 
{ 
    initialise_shared(); 

    pid_t pid = fork(); 
    if (!pid) { 
     run_child(); 
    } 
    else { 
     run_parent(pid); 
    } 

    munmap(data, sizeof(data)); 
    return 0; 
} 
+0

के साथ लिंक मैं इसे लेता हूं कि आप कुछ गलत विचार कैसे कर रहे थे इस पर कुछ विचार हैं? :) आप भी स्वीकार करने पर upvote कर सकते हैं! ;> – goji

+0

हां, धन्यवाद। एक थ्रेड के लिए एक संरचना गुजरने की तरह लगता है। बहुत ही सुविधाजनक। – user1743798

+0

अच्छा उदाहरण। मैंने इसे एक अलग पोस्ट का जवाब देने के लिए इस्तेमाल किया और इस जवाब का संदर्भ दिया। धन्यवाद! – DevNull

संबंधित मुद्दे