Потоки не ждут семафоров

#c #linux #multithreading #operating-system #semaphore

Вопрос:

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

 void sem_signal(int semid, int val)
{
    struct sembuf semaphore;
    semaphore.sem_num = 0;
    semaphore.sem_op = val;
    semaphore.sem_flg = 0;
    semop(semid, amp;semaphore, 1);
}

void sem_wait(int semid, int val)
{
    struct sembuf semaphore;
    semaphore.sem_num = 0;
    semaphore.sem_op = (-1*val);
    semaphore.sem_flg = 0;
    semop(semid, amp;semaphore, 1);
}
 

Вот как я инициализирую семафоры внутри основной функции.

     int semKey1 = ftok(path, 1);
    int semKey2 = ftok(path, 2);
    int semKey3 = ftok(path, 3);
      
    data_mutex = semget(semKey1, 1, 0700|IPC_CREAT);
    semctl(data_mutex, 0, SETVAL, 1);
    
    data_available = semget(semKey2, 1, 0700|IPC_CREAT);
    semctl(data_available, 0, SETVAL, 0); 
    
    wait_for_readers = semget(semKey2, 1, 0700|IPC_CREAT);
    semctl(wait_for_readers, 0, SETVAL, 0);
 

Это моя тема для чтения

 void* readerThreadFun()
{
    sem_wait(data_available, 1);
    printf("Subscriber with ID: %lu, read data with value: %i n", pthread_self(), data);
    
    sem_signal(wait_for_readers, 1);
    printf("Signalled waitn");
    
    return NULL;
}
 

Это моя тема издателя

 void* publisherThreadFun()
{

    sem_wait(data_mutex, 1);

    printf("Publisher with ID:%lu, got access to data with value %i n", pthread_self(), data);
    data = rand() % 25;
    printf("Publisher with ID:%lu, changed data to %i n", pthread_self(), data);
    
    sem_signal(data_available, 2);
    
    sem_wait(wait_for_readers, 2);
    printf("EXITED n");

    sem_signal(data_mutex, 1);


    return NULL;
}
 

Я ожидаю, что первый поток издателя получит data_mutex , поскольку его начальное значение равно 1, изменит данные и подаст сигнал ожидающим потокам чтения для чтения, увеличив data_available и дождавшись 2 операций чтения, уменьшив wait_for_signals семафор на два. Однако он вообще не ждет в этой строке, мгновенно выводит завершенную строку, и обычно вторые данные публикуются до того, как будет выполнено какое-либо чтение.

Я бы оценил всю помощь, это моя первая публикация на stackoverflow, так что извините, если что-то было сделано неуместно.

Комментарии:

1. У тебя есть semget(semKey2, .. два раза и нет semKey3