Похоже, что glib предоставляет мьютексы и условия как примитивы синхронизации потоков, но как насчет общего semaphores (в том смысле, что они поддерживают исходные операции P и V?) Правильно ли я понимаю, что GCond
эквивалентен двоичный семафор, с g_cond_signal
эквивалентом P
и g_cond_wait
эквивалентом V
? Но как насчет семафоров, не ограниченных максимальным значением 1?реализовать семафор
Я думал, что-то вроде этого:
struct semaphore {
int n;
GMutex sem_lock;
GCond sem_cond;
}
Если P
операция будет выглядеть примерно так:
void semaphore_P (struct semaphore *sem)
{
g_mutex_lock(sem->sem_lock);
while (sem->n == 0)
g_cond_wait(sem->sem_cond, sem->sem_lock);
--sem->n;
g_mutex_unlock(sem->sem_lock);
}
Есть более простой способ, чтобы получить в функциональности Pthreads' sem_wait
и sem_post
изнутри glib?