Ich habe zwei Prozesse, die Daten im Shared Memory haben. Diese Daten werden von diesen beiden Prozessen aktualisiert. Ich suchte nach einem Sperrmechanismus zwischen zwei Prozessen. Mit Threads war es einfach, eine gemeinsame Mutex-Sperre zu haben. In meinem Fall habe ich versucht, die Mutex-Variable im Shared Memory zu speichern, die dann von beiden Prozessen zum Sperren verwendet wird. Das hat aber nicht funktioniert. Wie teile ich einen Mutex zwischen zwei Prozessen? Einige sagen, Mutexe können nicht geteilt werden, verwenden Sie Semaphore. Warum Mutex kann nicht geteilt werden, aber Semaphore können sein?Synchronisierter Zugriff auf Daten im Shared Memory zwischen zwei Prozessen
1
A
Antwort
3
Es ist möglich, müssen Sie die Flagge PTHREAD_PROCESS_SHARED verwenden:
pthread_mutexattr_t mattr;
pthread_mutexattr_init(&mattr);
pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
// Init the shared mem barrier
if ((rv = pthread_mutex_init(&nshared, &mattr)) != 0) {
fprintf(stderr, "Failed to initiliaze the shared mutex.\n");
return rv;
}
Wo die Variable nshared
im gemeinsam genutzten Speicher zugeordnet ist.
Werfen Sie einen Blick auf diese documentation. Bedenken Sie auch, dass der Standardwert für den Mutex darin besteht, ihn nicht zwischen Prozessen zu teilen.
auch, werfen Sie einen Blick auf diese Beiträge post1post2
Bonus Code, den Status des Mutex Chek:
void showPshared(pthread_mutexattr_t *mta) {
int rc;
int pshared;
printf("Check pshared attribute\n");
rc = pthread_mutexattr_getpshared(mta, &pshared);
printf("The pshared attributed is: ");
switch (pshared) {
case PTHREAD_PROCESS_PRIVATE:
printf("PTHREAD_PROCESS_PRIVATE\n");
break;
case PTHREAD_PROCESS_SHARED:
printf("PTHREAD_PROCESS_SHARED\n");
break;
default :
printf("! pshared Error !\n");
exit(1);
}
return;
}
Ich erinnere mich nicht zugrunde lag ich dieses Stück Code ... fand es! here ist die Quelle des halben Wissens.