gpt4 book ai didi

c++ - linux c++ 创建具有最大值的信号量

转载 作者:太空狗 更新时间:2023-10-29 21:21:37 25 4
gpt4 key购买 nike

我想创建一个队列来存储我的任务,我希望它是一个缓冲队列,我想使用一个信号量来保持它的线程安全,因为我使用多个线程来执行从队列中弹出的任务task queue..当队列的大小小于buffer_size(我定义的一个变量)时,add_task线程会将新的任务推送到任务队列中,当它满时,任务线程会被阻塞,所以我需要最大值等于 buffer_size 的信号量。

我知道在windows api中,有CreateSemophore,我可以在其中设置信号量的最大值:

CreateSemaphore( 
NULL, // default security attributes
MAX_SEM_COUNT, // initial count
MAX_SEM_COUNT, // maximum count
NULL); // unnamed semaphore

但是在linux中,我只能得到sem_init函数:

int sem_init (sem_t *sem, int pshared, unsigned int value)

我只能设置初始值,但是最大值据说是int的范围..

所以我的问题是如何在 Linux 上用 C++ 创建一个具有最大值的信号量?

最佳答案

围绕这个明显的限制进行设计——使用两个信号量(和一个互斥量)。这是有界生产者-消费者队列的“经典”模式。

将其中一个“spaceRemaining”初始化为 buffer_size - 生产者在获取互斥锁和推送数据之前等待它,消费者在弹出数据并释放互斥锁后向它发出信号。

将另一个“entryCount”初始化为零 - 生产者在推送数据并释放互斥锁后向它发出信号,消费者在获取互斥锁和弹出数据之前等待它。

这样,就不需要对信号量的数量进行任何限制,伪代码:

Sema spaceRemaining(buffer_size);
Sema entryCount(0);
..
..
void *Producer(Data data){
spaceRemaining.wait();
mutex.acquire();
queue.push(data);
mutex.release();
entryCount.signal();
};

Data Consumer(){
entryCount.wait();
mutex.acquire();
Data localData=queue.pop();
mutex.release();
spaceRemaining.signal();
return localData;
};

关于c++ - linux c++ 创建具有最大值的信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22193152/

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