gpt4 book ai didi

semaphore - 实现一个信号量

转载 作者:行者123 更新时间:2023-12-02 02:15:52 25 4
gpt4 key购买 nike

似乎 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_waitsem_post从油然而生?

最佳答案

asynchronous queue可以用作信号量:

  • 初始化: 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 的第二个参数可以是除 NULL 之外的任何指针。
    但是,如果您想将信号量用于某些消费者/生产者任务,那么发送指向某些数据的指针将很有用。

    在某些情况下, a thread pool可能更适合。

    关于semaphore - 实现一个信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10711258/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com