我正在尝试同步一种特殊的生产者/消费者问题。
这是问题:
我有2个队列link_queue,page_queue。
线程类ProducePages_RequireLinks(称为class A),如其名称所示,从link_queue中消耗项目,并将每个链接的任意数量(≥1)的页面放入page_queue中。
相反,主线程ProduceLinks_RequirePages(称为class B)从page_queue中消耗页面,并将任意数量(≥0)的链接排队到link_queue中。
现在可能会出现class B比class A生成链接更快的情况。另一方面,反过来也可能发生。
如何在Ruby 1.9.2中正确同步这些线程?
我尝试在两者中都使用监视器,但在某些时候我最终陷入死锁。
(如果我没有准确,请通过评论告诉我,我会发布一些示例类)
编辑: 正在进行的图片: link_queue初始化为1项 page_queue初始化为0项
我们有4个class A线程和1个class B线程。每行都是一个时间步长。
线程A.1抓取1个链接(linkQ = 0),输出1个页面(pageQ = 1)
线程B抓取1页(pageQ = 0),输出400个链接(linkQ = 400)
线程A.3抓取1个链接(linkQ = 399),输出1个页面(pageQ = 1)
线程A.2抓取1个链接(linkQ = 398),输出1个页面(pageQ = 2)
线程B抓取1页(pageQ = 1),输出100个链接(linkQ = 498)
线程A.1抓取1个链接(linkQ = 497),输出1个页面(pageQ = 2)
线程A.4抓取1个链接(linkQ = 496),输出1个页面(pageQ = 3)
线程B注意到linkQ太大,等待直到linkQ <16
…线程A.*继续工作…之后(linkQ = 15)和(pageQ = 484)
现在我们有相反的问题。现在,线程A必须等待,直到pageQ下降到某个阈值以下。否则,我们最终会耗尽内存。
我有2个队列link_queue,page_queue。
线程类ProducePages_RequireLinks(称为class A),如其名称所示,从link_queue中消耗项目,并将每个链接的任意数量(≥1)的页面放入page_queue中。
相反,主线程ProduceLinks_RequirePages(称为class B)从page_queue中消耗页面,并将任意数量(≥0)的链接排队到link_queue中。
现在可能会出现class B比class A生成链接更快的情况。另一方面,反过来也可能发生。
如何在Ruby 1.9.2中正确同步这些线程?
我尝试在两者中都使用监视器,但在某些时候我最终陷入死锁。
(如果我没有准确,请通过评论告诉我,我会发布一些示例类)
编辑: 正在进行的图片: link_queue初始化为1项 page_queue初始化为0项
我们有4个class A线程和1个class B线程。每行都是一个时间步长。
线程A.1抓取1个链接(linkQ = 0),输出1个页面(pageQ = 1)
线程B抓取1页(pageQ = 0),输出400个链接(linkQ = 400)
线程A.3抓取1个链接(linkQ = 399),输出1个页面(pageQ = 1)
线程A.2抓取1个链接(linkQ = 398),输出1个页面(pageQ = 2)
线程B抓取1页(pageQ = 1),输出100个链接(linkQ = 498)
线程A.1抓取1个链接(linkQ = 497),输出1个页面(pageQ = 2)
线程A.4抓取1个链接(linkQ = 496),输出1个页面(pageQ = 3)
线程B注意到linkQ太大,等待直到linkQ <16
…线程A.*继续工作…之后(linkQ = 15)和(pageQ = 484)
现在我们有相反的问题。现在,线程A必须等待,直到pageQ下降到某个阈值以下。否则,我们最终会耗尽内存。
干杯!