我不确定是否需要使用像PLINQ这样的高级技术,这是因为我想重新表达上一个问题Paralleling trading software。我认为我的上一个问题太复杂且不清楚,我希望现在我准确地提取了所需的信息,仅此而已。

我有两个非常相似(我会说几乎相同)的线程。

线程1:

while (true)
    foreach (Object lockObj : lockObjects) {
        lock (lockObj) {
            // do work (may take some time)
        }
    }
}


Thread2(相同,但要完成另一项工作):

while (true)
    // the same lockObjects from Thread1 are used so threads use "shared" resources
    foreach (Object lockObj : lockObjects) {
        lock (lockObj) {
            // do another work (may take some time)
        }
    }
}


Profilier说,我正在等待释放锁的处理器时间约为30%。
如何轻松避免这种情况?怎么说:“好吧,如果对象现在被锁定,则推迟该对象的处理,处理另一个对象,过一会儿再返回该对象?”

最佳答案

一种方法是维护一个空闲对象队列,以及每个线程已处理内容的列表。让线程在处理它们时从尚未处理的队列中找到第一个空闲对象,并在完成后将其放回队列的末尾。

08-06 15:34