【发布时间】:2019-09-09 13:27:35
【问题描述】:
我的任务是为 posix pthreads 的读写器问题创建一个解决方案。我产生了 3 个读者和 1 个作者。
任务规范要求一次将值添加到队列 2(写入器)。读取器一次出列一个(当队列中存在值时)。该队列已经过测试并且可以正常工作。
我遇到的问题是,在运行程序时,大部分时间实际上只有 1 个阅读器线程在阅读。有时重复执行会导致所有 3 个阅读器都被使用。但大多数时候它只使用了 1 个阅读器。我不确定为什么会发生这种奇怪的行为。
提前致谢。
Expected (Sometimes):
TID: -684419328
TID: -684419328
TID: -673929472
TID: -673929472
TID: -694909184
TID: -694909184
...
Actual (Sometimes):
TID: -684419328
TID: -684419328
TID: -684419328
TID: -684419328
TID: -684419328
TID: -684419328
...
pthread_cond_t qServiced = PTHREAD_COND_INITIALIZER;
pthread_cond_t qElement = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
#include "rw.h"
#include "queue.h"
queue* q;
void* reader()
{
int serviced = 0;
int x;
while(!fin)
{
pthread_mutex_lock(&mutex);
counter++;
while(isEmpty(q))
{
pthread_cond_signal(&qEmpty);
pthread_cond_wait(&qElement, &mutex); e
}
printf("TID: %d\n", (int)pthread_self());
num* n = dequeue(q); //Take one task
printf("Num1: %d\n", n->num1);
printf("Num2: %d\n", n->num2);
serviced++;
pthread_cond_signal(&qServiced); //Signal that task has been serviced
pthread_mutex_unlock(&mutex);
}
}
【问题讨论】:
-
对于
pthread_cond_wait(&qEmpty, &mutex);,谁在发出 qEmpty 条件的信号? -
@user7176709 我明白了,添加了。不确定是否在正确的地方。但问题仍然存在:(
-
我不知道你为什么要写这个:
while(isEmpty(q)) { pthread_cond_signal(&qEmpty); pthread_cond_wait(&qElement, &mutex); } ' In thewriter`线程。为什么要检查写入线程中的空条件? -
@user7176709 我的错误我在stackoverflow中编辑了错误的代码部分。问题仍然存在。也许我在某处造成了竞争状况?
-
你用的是什么调度器?
标签: c pthreads producer-consumer