2012-05-22 2 views
3

Похоже, что 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?

ответ

2

asynchronous queue может быть использован в качестве семафора:

  • инициализации: GAsyncQueue * очереди = g_async_queue_new();

  • Операция V: g_async_queue_push (очередь, GINT_TO_POINTER (1));

  • Операция P: g_async_queue_pop (очередь);

Размер очереди служит счетчиком семафора. Второй параметр g_async_queue_push может быть любым указателем, за исключением NULL. Однако, если вы хотите использовать семафор для какой-либо задачи потребителя/производителя, то будет полезно отправить указатель на некоторые данные.

В некоторых случаях a thread pool может поместиться даже лучше.

Смежные вопросы