Писатели предпочитают семафоры в C ++ - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь написать код предпочтения писателя , чтобы предотвратить голодание писателя в случае, если он находится в очереди, и читатели пропускают его из-за своего приоритета.Счетчик, проверяющий, сколько читателей прочитало, защищен семафором (readerCount), семафор try используется для указания на то, что читатель пытается войти (psembufT), и семафор ресурса (psembufF).

Мне нужно записать в текстовый файл (код, написанный) в одном окне терминала и читать из другого в другом окне, всякий раз, когда я пытаюсь прочитать, я получаю Ошибка сегментации [ядро сброшено] ошибка.

#include <iostream>
#include <fstream>
#include <string>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <inttypes.h>
using namespace std;

#define SHM_KEY 9876                                    
#define SEMKEY  1234
struct sembuf vsembufR, psembufR, vsembufW, psembufW; 
struct sembuf vsembufF, psembufF, vsembufT, psembufT; 

int main()
{
union semun{   
    int val;
    struct semid_ds *buf;
    ushort myArray[0];
} arg;

string op;
ifstream myFile;                                 // makes an ifstream object to read from myFile

int shmid = shmget(SHM_KEY, 256, 0777|IPC_CREAT);
int *readerCount = (int*)shmat(shmid, 0, 0);    
int semid = semget(SEMKEY, 2, 0777|IPC_CREAT);  // Creates two semaphores
int pause;
readerCount = 0;

psembufR.sem_num=0;                          // init reader mutex members
psembufR.sem_op=-1;
psembufR.sem_flg=SEM_UNDO;
vsembufR.sem_num=0;
vsembufR.sem_op=1;
vsembufR.sem_flg=SEM_UNDO;

psembufF.sem_num=1;                          // resource
psembufF.sem_op=-1;
psembufF.sem_flg=SEM_UNDO;
vsembufF.sem_num=1;
vsembufF.sem_op=1;
vsembufF.sem_flg=SEM_UNDO;

psembufW.sem_num=0;                         // writer
psembufW.sem_op=-1;
psembufW.sem_flg=SEM_UNDO;
vsembufW.sem_num=0;
vsembufW.sem_op=1;
vsembufW.sem_flg=SEM_UNDO;

psembufT.sem_num=1;                         
psembufT.sem_op=-1;
psembufT.sem_flg=SEM_UNDO;
vsembufT.sem_num=1;
vsembufT.sem_op=1;
vsembufT.sem_flg=SEM_UNDO;

arg.val = 1;
semctl(semid, 0, SETVAL, arg);                
semctl(semid, 1, SETVAL, arg);

 while(1){
    cout << "Reader1:\n";
    pause = getchar();                      
    semop(semid, &psembufT, 1);             
    semop(semid, &psembufR, 1);             
    cout << "count inc" << endl;    
    *readerCount++;
    if(*readerCount == 1)                   // is this first reader
        semop(semid, &psembufF, 1);         // lok resource from writers if 1st reader
    semop(semid, &vsembufR, 1);             // unlock reader mutex (for other readers)
    semop(semid, &vsembufT, 1);             // unlock try mutex (done accessing file)
    // Critical Section
    myFile.open ("myFile.txt", ios::out | ios::app); // ::app appends the myFile (new line)                                           
    if(myFile.is_open()){        
        while(getline(myFile, op)){
            cout << op << endl;             // reads
        }
        myFile.close();
    }
    semop(semid, &psembufR, 1);             // lock reader mutex (avoid race)
    *readerCount--;
    if(*readerCount == 0)                   // is this the last reader
        semop(semid, &vsembufF, 1);         // unlock resource
    semop(semid, &vsembufR, 1);             // unlock reader mutex
}    

Я думаю, что это как-то связано с тем, как я объявил readerCount, но не могу понять.

1 Ответ

0 голосов
/ 14 декабря 2018

readerCount = 0; должно быть *readerCount = 0;

readerCount - это int*, поэтому, когда вы делаете readerCount = 0;, вы устанавливаете этот указатель на нулевой адрес.Когда вы позже попытаетесь обновить значение по этому адресу, вы, скорее всего, получите сбой.

...