Как мы можем реализовать синхронизацию процессов, используя мьютекс или семафор? - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь заблокировать массив общей памяти, чтобы только один процесс мог изменять его одновременно. Один процесс добавляет 5 одинаковых значений в мою общую память, а затем разблокирует ее для другого ожидающего процесса. Я пытался распечатать весь массив, прежде чем разблокировать мьютекс для каждого процесса, и кажется, что другие процессы могут изменять мой общий массив. Вот мой код, который делает выше:

#include<bits/stdc++.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <pthread.h>
#include <mutex>

using namespace std;

mutex mut;
int main(){


    int shmid5 = shmget(IPC_PRIVATE, 30*sizeof(int), 0777 | IPC_CREAT);
    int *number = (int *)shmat(shmid5, 0, 0);
    int shmid6 = shmget(IPC_PRIVATE, sizeof(int), 0777 | IPC_CREAT);
    int *counter = (int *)shmat(shmid6, 0, 0);
    int shmid7 = shmget(IPC_PRIVATE, sizeof(int), 0777 | IPC_CREAT);
    int *value = (int *)shmat(shmid7, 0, 0);
    *counter=0;
    *value=0;
    for(int i=0;i<2;i++){

        fork();
        mut.lock();
        (*value)++;
        for(int j=0;j<5;j++){
            number[*counter]= *value;
            (*counter)++;
            sleep(2);
        }
        for(int k=0;k<30;k++)
            cout<<number[k]<<" ";
        cout<<endl;

        mut.unlock();        
    }

}

Фактический вывод:

1 2 2 2 2 2 2 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 2 2 2 2 2 2 2 2 2 3 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 2 2 2 2 2 2 2 2 2 3 4 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 
1 2 2 2 2 2 2 2 2 2 3 4 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 
1 2 2 2 2 2 2 2 2 2 3 4 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 
1 2 2 2 2 2 2 2 2 2 3 4 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 

Ожидаемый вывод:

1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 0 0 0 0 0 0 0 0 0 0 
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 0 0 0 0 0 
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6

Я реализовал ту же логику c используя потоки, и все работало нормально. Но я хочу выполнить sh этот процесс с использованием разветвления. Как мне этого добиться ??

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Если вы хотите, чтобы мьютексы или cond-переменные были доступны всем процессам, вам нужно разместить их в сегменте памяти. Кроме того, вам необходимо инициализировать атрибуты мьютексов / cond-переменных с помощью PTHREAD_PROCESS_SHARED.

См. Здесь: ссылка

0 голосов
/ 07 марта 2020

Для этого вы можете использовать Семафоры POSIX .

...