2017-01-12 1 views
1

Ich versuche derzeit, zwei Prozesse in Linux mit dem pthread_mutex-Modell zu synchronisieren.pthread_mutex basiert Interprozesskommunikation funktioniert nicht

Hier ist der Code Ich arbeite an:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 
#include <unistd.h> 

using namespace std; 

int main (int argc, char **argv) 
{ 
    printf ("starting process\n"); 

    if (_POSIX_THREAD_PROCESS_SHARED == -1) { 
     printf ("shared mutex is not supported!\r\n"); 
    } 

    pthread_mutexattr_t attr; 
    pthread_mutex_t shm_mutex; 


    if (pthread_mutexattr_init(&attr) != 0) 
     printf ("init attr error!\r\n"); 
    if (pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_NORMAL) != 0) 
     printf ("set type error!\r\n"); 
    if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED) != 0) 
     printf ("set shared error!\r\n"); 

    int value; 
    if (pthread_mutexattr_getpshared(&attr, &value) != 0 || value != PTHREAD_PROCESS_SHARED) { 
     printf ("mutex is not shared!\r\n"); 
    } 

    if (pthread_mutex_init(&shm_mutex, &attr) != 0) 
     printf ("mutex init error!\r\n"); 

    for (int i=0; i < 10; i++) { 

     if (pthread_mutex_lock(&shm_mutex) != 0) 
      printf ("lock error!\r\n"); 

     printf ("begin run %d\r\n", i); 
     sleep(10); 
     printf ("end run %d\r\n", i); 

     if (pthread_mutex_unlock(&shm_mutex) != 0) 
      printf ("unlock error!\r\n"); 

     sleep(1); // sleep 1 second 
    } 

    pthread_mutex_destroy(&shm_mutex); 
    pthread_mutexattr_destroy(&attr); 

    return 0; 
} 

Wenn ich zwei separate Prozesse ausgeführt, die Anfang/Ende Logik doesm't Arbeit.

Ist irgendetwas mit dem Code falsch?

+0

Ich glaube, dass Sie den Mutex in Shared Memory zuweisen müssen, um jede Möglichkeit der Interprozessfreigabe zu haben. Es gibt keine Möglichkeit in Ihrem Code, dass die Prozesse identifizieren, welchen Mutex sie teilen würden. – molbdnilo

Antwort

3

Sie sollten shm_mutex in Shared Memory selbst zuweisen. Siehe man shm_overview. Die Flagge bedeutet lediglich, dass du das mit dem Mutex machen darfst.

Weitere Informationen finden Sie unter this reference.

Verwandte Themen