我正在尝试使用 POSIX 线程实现阻塞队列。重要的代码段如下所示。我尝试运行这个程序。当队列中没有元素时,尝试从队列中删除元素的线程将进入休眠状态,并在没有来自将元素添加到队列中的线程的任何信号的情况下再次唤醒(我得出的结论是,因为我没有启动任何线程将一个元素添加到队列中)。唤醒的线程再次进入休眠状态,并重复此过程。我究竟做错了什么?请有人告诉我我在这里缺少什么?
struct rqueue
{
int qsize;
int capacity;
pthread_mutex_t lock;
pthread_cond_t not_empty;
pthread_cond_t not_full;
};
删除元素方法:
pthread_mutex_lock(&rq->lock);
while(rq->qsize == 0){
perror("Q size is zero going to sleep");
pthread_cond_wait(&rq->not_empty);
perror("woke up");
}
// some code
pthread_cond_signal(&rq->not_full);
pthread_mutex_unlock(&rq->lock);
添加元素方法:
pthread_mutex_lock(&rq->lock);
if(rq->capacity != -1 ){
while(rq->qsize == rq->capacity){
pthread_cond_wait(&rq->not_full);
}
}
//some code
pthread_cond_signal(&rq->not_empty);
pthread_mutex_unlock(&rq->lock);
最佳答案
pthread_cond_wait() 有两个参数——第二个是您持有的互斥体。您只向它传递一个参数。
此外,您是否使用 pthread_mutex_init() 和 pthread_cond_init() 初始化了互斥体和条件变量?
关于c - 我的 Posix 线程在没有信号的情况下唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7775215/