gpt4 book ai didi

c - 是否有一种内置信号量结构允许等待多个资源?

转载 作者:行者123 更新时间:2023-11-30 14:39:56 26 4
gpt4 key购买 nike

我希望能够一次等待/发布多个资源。是否有内置的 C 结构和接口(interface)允许这样做?

目前我正在使用semaphore.h,但是该接口(interface)有一个限制,即它一次只能请求一个资源。

我可以做这样的事情:

for (int i = 0; i < resources; i++)
sem_wait(my_sem);

但是如果资源很大,这将非常耗时,并且我还需要在此之前添加另一个锁,以便保证请求者比可能请求资源的其他线程具有优先级。它最终会看起来像这样:

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 信号量。它们不直接提供以原子方式将信号量值更改超过 1 的可能性,除非创建新信号量。

System V 信号量 (semget/semctl/semop) 通常被认为较差,但它们确实具有 POSIX 风格所缺乏的一些功能,这就是其中之一。具体来说,您可以使用 semop() 从信号量的值中自动扣除任何正数,并进行阻塞,直到可以在不将值减少到零以下的情况下完成此操作为止。

但是 System V IPC 总体上已经足够令人痛苦了,我建议改为设置一个表示当前可用资源数量的共享变量,并使用互斥锁 + 条件变量而不是信号量。看起来像这样:

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

关于c - 是否有一种内置信号量结构允许等待多个资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55838043/

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