|
|
1
2
如果“每个线程一行”不是一个严格的要求,您可能根本不需要锁定,并且有时最多可以执行两行或三行。然后,您可以根据公式平均拆分文件。假设您希望读取总共1024 kbyte块中的文件(也可以是千兆字节):您将其拆分为具有优先级的核心。所以:
所以理想情况下它们不会重叠。有些情况下它们可以重叠。因为您正在读取一个文本文件,所以一行可能会落在下一个核心的块中。为了避免重叠,您总是跳过其他核心的第一行,并且总是完成最后一行,假设下一个线程无论如何都会跳过它,这里是伪代码:
如您所见,这与读取块的处理是并行的,而不是读取本身。你如何将阅读并行化?最棒的方法是内存将整个块映射到内存中。这将获得最佳的I/O性能,因为它是最低的级别。 |
|
|
2
1
一些想法: 1)由于瓶颈不在IO中,因此文件应几乎完全保存在RAM中,以便于访问。 2)实现不应允许线程阻塞。如果能减少阻塞,最好有稍微非最优的解决方案。 假设我们有大数据文件线程可以采用暗中射击战术。这意味着一旦线程获得锁,它只会增加fpo并解锁内存。然后它授予自己处理刚得到的内存部分的特权。例如,线程可以处理片段中所有以其开头的行。 结果: 1)螺纹几乎不可能堵塞。锁定时间非常短(在几个指令的范围内+刷新缓存的时间) 2)灵活性。线程可以接受任意多的数据。 当然,应该有一些机制来适应数据文件中行的长度,以避免出现最坏的情况。 |
|
|
3
0
我会用缓冲器。让一个线程从磁盘填充缓冲区。每个线程将锁定缓冲区,将数据读取到线程的缓冲区,然后在处理数据之前释放互斥体上的锁。 |
|
|
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 1 年前 |
|
|
H3007 · 并发运行python子进程似乎不是并发的 1 年前 |
|
|
The Oddler · TVar会阻止读取直到更改吗? 1 年前 |
|
|
Wang Tuma · 使用信号量的c++并发问题:按顺序打印 1 年前 |
|
|
Marcel Batista · 在不同线程中更新密钥时的字典线程安全 2 年前 |
|
|
rico · 当volatile关键字真的是必要的? 2 年前 |