タスクのキューがあり、各タスクに共有リソースアクセスを制御するロックオブジェクト(syncObject)があるとします。キューには、syncObjectの同じインスタンスを共有する複数のタスクを含めることができます。また、タスクをデキューしてキュー順に処理する必要があるN個の同時スレッドがあります。これは、キューの順序でsyncObjectのロックを取得することを意味します。
コードの説明:
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ロックを取得する)。