首先只是为了确定,pthread_cond_signal
不发送一个意义上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;
}