【发布时间】:2012-11-01 06:54:26
【问题描述】:
假设我有一个任务队列,每个任务都有一个锁定对象(syncObject)来控制共享资源访问,队列可以有多个任务共享相同的同步对象实例。而且我有 N 个并发线程应该使任务出队并按队列顺序处理它们,这意味着按队列顺序获取同步对象的锁定。
代码说明:
abstract class Task
{
public readonly Object SyncObject = new Object();
}
Queue<Task> taskQueue = new Queue<Task>();
Object queueLock = new Object();
void TakeItemThreadedMethod()
{
Task task;
lock(queueLock) task = taskQueue.Dequeue();
//Between this lines is my problem,
//Other thread can dequeue next task and it may share same syncObject and
//acquire lock on it before this thread, thought this task was first in queue
lock(task.SyncObject)
{
//Do some work here
}
}
如何开始处理按队列中的顺序共享相同 SyncObject 的任务(获取 Task.SyncObject 锁)。
【问题讨论】:
-
我一定是误解了一些东西,但是如果你必须按顺序处理任务,那么使用多个线程将无济于事,因为只有 1 个线程会运行,而其余线程会阻塞。
-
您可以为它们使用不同的队列,而不是让“任务共享相同的同步对象实例”。
-
@L.B:很高兴听到我的想法不是一个疯狂的想法 :) 当您添加该评论时,我一定是在写它...
标签: c# multithreading