Я пытаюсь заблокировать массив общей памяти, чтобы только один процесс мог изменять его одновременно. Один процесс добавляет 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 этот процесс с использованием разветвления. Как мне этого добиться ??