![]() |
1
2
如果您的问题是如何确定哪个线程正在下载第一个块,以及第一个块何时可以使用,请为每个线程使用一个事件,并跟踪已分配给哪个线程的块。跟踪传递给第一个线程的事件(将下载第一个数据块)、传递给第二个线程的事件(用于第二个数据块)等。主线程或另一个后台线程(避免阻塞ui线程)等待第一个事件。当第一个线程下载完它的块时,它设置/发送第一个事件。等待的线程随后将唤醒,并可以使用第一个数据块。 其他下载线程也可以这样做,在完成时发送各自的事件。使用手动重置事件,这样即使没有人在等待,事件也会保持信号。当需要数据块顺序的线程处理完第一个数据块时,它可以等待第二个事件。如果第二个事件已经发出信号,那么等待将立即返回,线程可以开始处理第二个数据块。 对于非常大的下载,您可以循环使用事件和线程。它们完成的顺序并不重要,只要使用数据块的线程按顺序使用它们并按顺序等待相应的事件。 如果你聪明小心,你可能只需要使用一个事件就可以做到这一切:创建一个最初设置为空的数据块指针/对象的全局数组,工作线程下载数据块并将完成的块分配给全局数组中各自的槽,然后发信号给共享事件。使用者线程保留一个数据块计数器,以便它知道下一个需要处理的数据块,等待共享事件,并在发出信号时查看全局数组中的下一个插槽,以查看是否有数据出现在那里。如果序列中的下一个插槽中仍然没有数据,则使用者线程返回到等待事件。您还需要一种方法让工作线程知道下一步应该下载哪个数据块—一个受互斥锁保护或使用interlockedd/exchange访问的全局计数器就足够了。每个工作线程递增全局计数器并下载该数据块编号,并将结果分配给数据块全局列表中的第n个槽。 |
![]() |
2
0
你能告诉我下载的代码,以及启动多个异步线程的代码吗? 也许我没有完全理解你的场景,但是如果我是你,我会使用async(从responsestream开始)。然后我会做以下的…
|
![]() |
3
0
要创建一个同步的多线程下载程序,您需要创建正确的数据结构,而不仅仅是
步骤:
如果您感兴趣,可以查看 prozilla (c,基于linux的-at)或axel。 |
![]() |
user107586 · 如何处理等待句柄不会导致无限循环? 5 月前 |
![]() |
ron burgundy · 获取-释放语义是否跨线程传递?[副本] 5 月前 |
![]() |
BenjiFB · C#内存缓存:在一次操作中追加到列表? 5 月前 |
![]() |
András Takács · Python多线程问题 9 月前 |
|
András Takács · Python多线程错误 9 月前 |