Семантика sem_getvalue () в POSIX - PullRequest
0 голосов
/ 12 мая 2019

Мне нужно решить проблему синхронизации, используя PThreads. В некоторый момент в коде одному потоку нужно знать количество потоков, заблокированных на семафоре (как определено в sempahore.h).

Когда я взглянул на справочные страницы sem_getvalue(sem_t *s, int *sval), было указано, что возвращаемое значение sval в Linux равно 0, но может иметь другую семантику в соответствии с POSIX, то есть абсолютное значение sval устанавливается на количество потоков, заблокированных на семафоре s.

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

Я попытался смоделировать число потоков, заблокированных на определенном семафоре, отслеживая целочисленную переменную каждый раз, когда поток выполняет sem_wait() на этом семафоре. Но меня интересует правильность этого метода, особенно для условий гонки.

Ответы [ 2 ]

2 голосов
/ 12 мая 2019

из руководства

sem_getvalue () помещает текущее значение семафора, на которое указывает sem в целое число, на которое указывает sval.

Семафор указан первым аргументом s (sem_t * s). В sem_getvalue () есть второй аргумент sval, который является указателем на int. Значение семафора возвращается в этом целом числе, указатель на который равен sval.

Функция sem_getvalue () возвращает 0 в случае успеха и -1 в случае ошибки.

2 голосов
/ 12 мая 2019

Этот вопрос по своей сути является довольно редким, и функция sem_getvalue, даже если она возвращает полезное указание числа официантов, не может обеспечить какую-либо гарантию того, что счет все еще верен, когда он возвращается, и вы используете полученное значение. Это звучит как проблема XY, поэтому вам, вероятно, следует лучше объяснить, что вы представляете себе в состоянии достичь, имея такой счет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...