Дочерние процессы не работают одновременно - PullRequest
0 голосов
/ 14 ноября 2018

Итак, я пишу систему бронирования отелей, в которой у меня есть гостиничные номера, хранящиеся в общей памяти, и количество клиентов будет забронировано, отменено, оплачено и т. Д.Каждый клиент будет дочерним процессом, и все они должны работать одновременно, пытаясь выполнить указанные транзакции для комнат.

Вот мой код для разветвления дочерних процессов:

int pid[10];
for(int i = 0; i < numOfCustomers; i++) {
    pid[i] = fork();
    if(pid[i] < 0) {
        perror("Bad fork");
    }
    else if(pid[i] == 0) { //is child i (Each customer is a child process)
        cout << "CUSTOMER: " << i << endl;
        while(!customers[i].transactions.empty()) { //runs until customer finishes all transactions
            string op = customers[i].transactions.front();
            if(op == "reserve") {
                if(sem_wait(semid, 0))
                    exit(1);
                Reserve tempq = customers[i].reservequeue.front();
                for(int i = 0; i < tempq.roomcounter; i++) {
                    int roomnum = tempq.roomqueue.front();
                    if(shared_memory[roomnum-1].isavailable == true) {
                        shared_memory[roomnum-1].isavailable = false;
                        shared_memory[roomnum-1].day = tempq.day;
                        shared_memory[roomnum-1].month = tempq.month;
                        shared_memory[roomnum-1].year = tempq.year;
                        shared_memory[roomnum-1].customer = cust;
                    }
                    else {
                        cout << "Room " << roomnum << " already taken." << endl;
                    }
                    tempq.roomqueue.pop();
                }
                customers[i].reservequeue.pop();
                if(sem_signal(semid, 0))
                    exit(1);
            }
            else if(op == "cancel") { //not done yet
                cout << "cancel" << endl; 
            }
            else if(op == "check") { //not done yet
                cout << "check" << endl;
            }
            else if(op == "pay") { //not done yet
                cout << "pay" << endl;
            }
            customers[i].transactions.pop();
        }
        exit(0);
    }
    else { //is parent

    }
}

//waits for each process to finish
for (int i = 0; i < numOfCustomers; i++) {
    wait(NULL);
}

Проблема в том, что сначала все выполняется в дочернем элементе, затем завершается, а затем - в дочернем 2. Процессы не выполняются одновременно, что отрицательно сказывается на общей цели использования общей памяти и использования семафоров.

Любая помощь будет принята с благодарностью, спасибо.

...