4

glib はスレッド同期プリミティブとしてミューテックスと条件を提供しているようですが、一般的なセマフォについてはどうですか(元の P および V 操作をサポートするという意味で)。、および?と同等です。しかし、最大値が 1 に制限されていないセマフォはどうでしょうか?GCondg_cond_signalPg_cond_waitV

私は次のようなことを考えました:

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 の機能を glib 内から取得する簡単な方法はありsem_waitますsem_postか?

4

1 に答える 1

4

非同期キューはセマフォとして使用できます。

  • 初期化: GAsyncQueue *queue = g_async_queue_new();

  • V 操作: g_async_queue_push(queue, GINT_TO_POINTER(1));

  • P 操作: g_async_queue_pop(queue);

キューのサイズは、セマフォのカウンターとして機能します。g_async_queue_push の 2 番目のパラメーターは、NULL 以外の任意のポインターにすることができます。ただし、一部のコンシューマー/プロデューサー タスクにセマフォを使用する場合は、一部のデータへのポインターを送信すると便利です。

場合によっては、スレッド プールの方が適している場合もあります。

于 2013-08-31T16:19:50.560 に答える