gpt4 book ai didi

c++ - pthread_cond_wait 和 pthread_cond_signal 的性能

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

我有两个线程。从队列中读取的一个。我不希望它在 while(1) 上运行来读取,所以我正在考虑为每个循环提供一个条件变量:

while(1){
while queue is not empty
wait(cond)
pop()
}

而不是:

while(1){
while queue is not empty
pop
}

还有一个推送到队列的线程。如果我使用等待和信号方法,那么该线程每次推送时都需要通过向弹出线程发出信号来进行通知(!)问题是用什么比较好?如果队列大部分不为空,那么发送信号是没有值(value)的(或者不是?),因为弹出线程没有等待,而且我担心它会降低性能。但是,如果队列有一半时间是空的,则像第二种弹出方法那样对其进行循环可能会导致繁忙等待。

我希望这里有人能消除我的恐惧,取消向不等待它的线程发送信号仍然可以的事实

谢谢

最佳答案

首先要确保,pthread_cond_signal 不会发送 signal(2) 意义上的信号。它只是标记条件变量并释放等待它的任何变量。因此,如果您在消费进程调用之前调用 pthread_cond_signal ,那么它就会被忽略。

其次,pthread_cond_wait是快还是慢?这得看情况。你可以用得不好,也可以用得好。如果你使用得不好,我相信它会表现得很糟糕。如果你只在真正需要的时候等待,我认为它会表现得很好。

所以,既然需要持有一个互斥体才能使用条件变量,那么不妨检查此时是否有数据(并使用这个互斥体作为同步点)。

队列数据结构的想法:

struct q {
struct qe *h;
struct qe *t;

pthread_mutex_t m;
pthread_cond_t c;
int len;
};

消费者(假设你只有一个消费者,如果有多个则需要围绕头部进行锁定检查):

void *consumer(void*arg) {
struct q *q = arg;

while(1) {
pthread_mutex_lock(&q->m);
if(q->h == NULL)
pthread_cond_wait(&q->c, &q->m);
/* We hold the mutex when we exit pthread_cond_wait */
pthread_mutex_unlock(&q->m); /* we can make the check without the mutex */
while(q->h != NULL) {
pthread_mutex_lock(&q->m); /* but we need it to modify */
pop();
pthread_mutex_unlock(&q->m);
/* Process data */
}
}
}

制作人:

void *producer(void*arg) {
int i;
struct q *q = arg;
while(1) {
pthread_mutex_lock(&q->m);
push(q, some_data);
if(q->h == q->t) /* only one element */
pthread_cond_signal(&q->c);
pthread_mutex_unlock(&q->m);
}
return NULL;
}

关于c++ - pthread_cond_wait 和 pthread_cond_signal 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13516959/

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