是否存在允许等待多个资源的内置信号量结构? [英] Is there a built-in semaphore structure that allows for waiting on more than one resource?
本文介绍了是否存在允许等待多个资源的内置信号量结构?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我希望能够一次等待/发布多个资源。是否有内置的C结构和接口允许这样做?
我当前使用的是semaphore.h
,但是此接口的限制是一次只能请求一个资源。
我可以这样做:
for (int i = 0; i < resources; i++)
sem_wait(my_sem);
但如果resources
很大,这将非常耗时,而且我还需要在此之前添加另一个锁,以便确保请求者拥有比可能请求资源的其他线程更高的优先级。
结果如下所示:
sem_wait(my_lock);
for (int i = 0; i < resources; i++)
sem_wait(my_sem);
sem_post(my_lock);
更不用说需要进行的额外错误检查了。
我希望能够做的事情如下:
sem_wait(my_lock, resources);
这将简单地等待,直到所有资源都可用,然后在将信号量递减所请求的资源数量之后返回。我觉得我前段时间见过这样的事情,但似乎想不通。
POSIX
您当前正在使用推荐答案信号量。它们不直接提供以原子方式将信号量的值更改一个以上的可能性,除非创建新的信号量。
system V信号量(semget
/semctl
/semop
)通常被认为是次要的,但它们确实具有POSIX风格所缺少的一些特性,这就是其中之一。具体地说,您可以使用semop()
以原子方式从信号量的值中减去任何正数,直到可以在不将值减少到零以下的情况下完成此操作为止。
unsigned resources_available = ALL_RESOURCES;
pthread_mutex_t resource_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t resource_cv = PTHREAD_COND_INITIALIZER;
// ...
int acquire_resources(unsigned resources_wanted) {
int result;
// ...
result = pthread_mutex_lock(resource_mutex);
// handle errors ...
while (resources_available < resources_wanted) {
result = pthread_cond_wait(resource_cv, resource_mutex);
// handle errors ...
}
resources_available -= resources_wanted;
result = pthread_mutex_unlock(resource_mutex);
// ...
}
int release_resources(unsigned resources_released) {
int result;
// ...
result = pthread_mutex_lock(resource_mutex);
// handle errors ...
resources_available += resources_released;
result = pthread_cond_broadcast(resource_cv);
// handle errors ...
result = pthread_mutex_unlock(resource_mutex);
// ...
}
这篇关于是否存在允许等待多个资源的内置信号量结构?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文