是否存在允许等待多个资源的内置信号量结构?

编程入门 行业动态 更新时间:2024-10-25 02:29:24
本文介绍了是否存在允许等待多个资源的内置信号量结构?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我希望能够一次等待/发布多个资源。是否有内置的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()以原子方式从信号量的值中减去任何正数,直到可以在不将值减少到零以下的情况下完成此操作为止。

但总的来说,System V IPC已经够麻烦的了,我建议您改为设置一个表示当前可用资源数量的共享变量,并使用mutex+条件变量而不是信号量。如下所示:

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); // ... }

更多推荐

是否存在允许等待多个资源的内置信号量结构?

本文发布于:2023-10-09 06:24:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1474953.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:信号量   多个   是否存在   结构   资源

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!