#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