阅读器线程未退出-Posix Pthreads

时间:2019-04-20 12:59:03

标签: c multithreading pthreads posix pthread-join

我必须使用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)

1 个答案:

答案 0 :(得分:1)

您仅提供了代码草图,但我无法进行完整的分析,但是即使草图也显示出您的方法存在缺陷。当编写器提供新数据时,它会解锁一个阅读器:

            pthread_cond_signal(&qElement);

如果两位读者都在等待作者写完最后几幅作品(可能出现),那么当作家终止时会等待一个人。

最好的解决方案是使用pthread_cond_broadcast()代替pthread_cond_signal()或除Toplevel()之外。最好用后者代替前者,因为您的读者无论如何都应该保护自己免受伪造的唤醒(看起来确实如此)。不过,如果愿意,您可以在作家终止之前广播它,或者在它加入作家之后广播主线程。

此外,我倾向于认为您使用的简历比实际需要的要多得多。您很有可能只用一种,这样写起来和推论都更简单。