【发布时间】:2019-09-10 10:14:57
【问题描述】:
我必须使用 posix pthreads 为读者和作者问题创建一个解决方案,我已将我的代码压缩为与 C 混合的伪代码,以减少代码的大小。
编写器线程正常完成,但读取器线程永远不会终止/退出,因此Reader join 将永远等待,程序挂起。
我相信这与阅读器功能中的等待条件pthread_cond_wait(&qElement, &mutex);有关。它可能正在等待终止的写入器线程发出信号。我已经尝试用if(!finished) 封装它,所以它只会等待作者仍然处于活动状态但仍然没有工作。
我不确定该怎么做,并认为这是我的 pthread 处理的逻辑错误。
非常感谢您的帮助。
Global variables in header file :
#define TRUE 1
#define FALSE 0
int finished = FALSE
pthread_cond_t qServiced = PTHREAD_COND_INITIALIZER;
pthread_cond_t qEmpty = PTHREAD_COND_INITIALIZER;
pthread_cond_t qElement = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int main()
{
Create 1 writer thread
Create 2 reader threads
Writer join <- Success
Reader join <- Program hangs here
void* writer()
{
int totalQueued = 0;
int tasks = 20;
while(!finished)
{
pthread_mutex_lock(&mutex);
while(isFull(q))
{
pthread_cond_wait(&qEmpty, &mutex);
}
if(totalQueued < tasks)
{
for(j = 0; j < 2; j++) //Add 2 numbers at a time
{
if(!(isFull(q)))
{
//Assume random numbers added to queue
totalQueued++;
}
}
pthread_cond_signal(&qElement);
pthread_cond_wait(&qServiced, &mutex);
}
else
{
finished = TRUE;
}
pthread_mutex_unlock(&mutex);
}
//Thread exits
}
void* reader()
{
while(!finished)
{
pthread_mutex_lock(&mutex);
while(isEmpty(q)) //If the queue is empty
{
pthread_cond_signal(&qEmpty);
pthread_cond_wait(&qElement, &mutex);
}
int n = dequeue(q);
printf("%d\n", n);
pthread_cond_signal(&qServiced); //Signal that task has been serviced
pthread_mutex_unlock(&mutex);
}
}
【问题讨论】:
标签: c multithreading pthreads posix pthread-join