我必须使用posix pthreads创建一个解决读者作家问题的方法,我已经将代码压缩为与C混合的伪代码,以减少代码的大小。
写程序线程完成得很好,但是读程序线程永不终止/退出,因此function my_plot_of_whatever
x = linspace(0, 1, 101);
y = (x.*2.2*(10^-4)) ./ ( ( x.+6.25*(10^-2)) .* (x.+2.2*(10^-2)) );
plot(x, y)
一直处于等待状态,程序挂起。
我认为这与阅读器功能中的等待条件Reader join
有关。它可能正在等待终止的写程序线程发出信号。我尝试用pthread_cond_wait(&qElement, &mutex);
封装它,因此它仅在写入器仍处于活动状态但仍没有起作用时才等待。
我不确定该怎么做,并认为这是我的pthread处理中的逻辑错误。
非常感谢您的帮助。
if(!finished)
答案 0 :(得分:1)
您仅提供了代码草图,但我无法进行完整的分析,但是即使草图也显示出您的方法存在缺陷。当编写器提供新数据时,它会解锁一个阅读器:
pthread_cond_signal(&qElement);
如果两位读者都在等待作者写完最后几幅作品(可能出现),那么当作家终止时会等待一个人。
最好的解决方案是使用pthread_cond_broadcast()
代替pthread_cond_signal()
或除Toplevel()
之外。最好用后者代替前者,因为您的读者无论如何都应该保护自己免受伪造的唤醒(看起来确实如此)。不过,如果愿意,您可以在作家终止之前广播它,或者在它加入作家之后广播主线程。
此外,我倾向于认为您使用的简历比实际需要的要多得多。您很有可能只用一种,这样写起来和推论都更简单。