|
|
1
6
并发编程不提供定义的执行顺序,除非您自己使用MVAR等来强制执行。因此,很可能生产线会在任何消费者读出并传递之前将所有/大部分行粘贴到chan中。另一个应该满足需求的架构是让线程A调用lazy readfile并将结果粘贴到MVAR中。然后,每个使用者线程获取MVAR,读取一行,然后在继续处理该行之前替换MVAR。即使这样,如果输出线程不能跟上,那么存储在chan上的匹配行的数量也可以任意增加。 您所拥有的是推送架构。要真正使它在恒定的空间中工作,就要以需求驱动的方式思考。找到一种机制,使输出线程向处理线程发出信号,表示它们应该做些什么,并使处理线程向读卡器线程发出信号,表示它们应该做些什么。 另一种方法是使用有限大小的通道——这样,当处理器线程没有赶上时,读线程会阻塞,而当输出线程没有赶上时,处理器线程会阻塞。 总的来说,这个问题实际上让我想起了TimBray的WideFinder基准,尽管需求有所不同。无论如何,它导致了关于实现多核grep的最佳方法的广泛讨论。最大的问题是这个问题是IO绑定的,您需要在mmap文件上有多个读线程。 在这里看到的比你想知道的更多: http://www.tbray.org/ongoing/When/200x/2007/09/20/Wide-Finder |
|
|
a a · 为什么在这个可重入锁示例中需要引用计数? 3 年前 |
|
|
Grant · goroutines有高空闲唤醒电话 3 年前 |
|
|
hoaz · 如何安全地清理并发映射 7 年前 |
|
|
Alanpatchi · int基元类型的volatile声明 7 年前 |