gpt4 book ai didi

我们可以使用 pthread 库中的同步原语实现类似信号量的行为吗?

转载 作者:太空宇宙 更新时间:2023-11-04 08:53:45 25 4
gpt4 key购买 nike

我浏览了 Linux 中提供的信号量 API。信号量的一个简单用法是

sem_wait()
//do something
sem_post()

是否可以通过使用 pthread 库中可用的同步原语来实现类似的行为?

通过 POSIX API 后,我想出了以下代码:

int a = COUNT_LIMIT; //global variable
pthread_mutex_t m1;
pthread_cond_t c1;

pthread_mutex_lock(&m1);
while(a==0){
pthread_cond_wait(&c1, &m1);
}
a--;
//do whatever i want to do, as resource is available
pthread_cond_signal(&c1,&m1);
pthread_mutex_unlock(&m1);

我相信这段代码可以解决问题,但实现此行为的最佳实践是什么?

最佳答案

您应该只在测试和更改 a 时持有互斥量。

sem_wait() {
pthread_mutex_lock(&m1);
while (a == 0) pthread_cond_wait(&c1, &m1);
a--;
pthread_mutex_unlock(&m1);
}
sem_post() {
pthread_mutex_lock(&m1);
a++;
pthread_cond_signal(&c1);
pthread_mutex_unlock(&m1);
}

真正的问题是,why would you want semaphores ?除非你真的有一组真正无法区分的资源,否则互斥体往往更容易推理,因为它们需要储物柜来解锁它们。例如,对于互斥量,您可以通过检测等待图中的循环来进行死锁检测,而对于信号量,您需要使用更复杂的死锁检测算法,例如 Dijkstra's Banker's algorithm。 .

关于我们可以使用 pthread 库中的同步原语实现类似信号量的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18462560/

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