有N个资源的列表,每个资源一次最多可以被一个线程查询。
有几个线程需要在大致相同的时间做同样的事情:查询每个资源(每个线程有不同的查询),以任意顺序,并收集响应。
如果每个线程以相同的顺序循环资源,从 0 到 N-1,那么它们可能不得不相互等待,这样效率不高。
我想过让线程以随机排列的方式循环资源,但这似乎太复杂而且效率也不高,例如,对于 2 个资源和 2 个线程,在一半的情况下它们会选择相同的顺序并等待每个其他。
有没有一种简单有效的方法来解决这个问题?
有N个资源的列表,每个资源一次最多可以被一个线程查询。
有几个线程需要在大致相同的时间做同样的事情:查询每个资源(每个线程有不同的查询),以任意顺序,并收集响应。
如果每个线程以相同的顺序循环资源,从 0 到 N-1,那么它们可能不得不相互等待,这样效率不高。
我想过让线程以随机排列的方式循环资源,但这似乎太复杂而且效率也不高,例如,对于 2 个资源和 2 个线程,在一半的情况下它们会选择相同的顺序并等待每个其他。
有没有一种简单有效的方法来解决这个问题?
也许你应该反过来想。关键是防止资源匮乏,即尽可能减少资源不处理请求的时间。通常队列在这里很有用。
鉴于您最多有 8 个不同的资源,我会给每个资源一个自己的线程和一个队列。查询线程将首先将其所有请求放入这些队列中,然后等待,同时从该队列中消耗资源。这样,资源将被请求饱和并最小化饥饿。
不知何故,我对此的回答是没有。您无法控制线程以及它们访问资源的顺序,而且最重要的是(这是同步的全部要点)您不知道它们将如何安排执行。即使试图让他们访问免费资源也会产生不可预知的结果,因为可以先调度创建的最后一个线程。
我唯一想到的就是分区。也就是说,将要访问/被访问的资源和/或线程分成几部分。请注意,这不是一个简单的问题:正如您所说,拥有更少的线程和更少的资源会增加线程尝试访问已锁定资源的机会。
只需在使用时从列表中删除资源,因此每个线程都会:
显然列表访问需要同步。这样,您将永远不会有 2 个线程尝试使用相同的资源。