Межпроцессная блокировка - PullRequest
       19

Межпроцессная блокировка

0 голосов
/ 17 сентября 2010

Я пишу систему для автоматического пересчета результатов дорогостоящих методов, а затем сохраняю их в кеше.Кэш может быть распределен, что означает (очевидно), что несколько процессов могут получить к нему доступ.

При первом вызове метода для кэширования результата, я хочу создать поток, который будет периодически пересчитывать результат методаи обновите кеш.

Я хочу, чтобы для каждого элемента кэша создавался только один поток выполнения.В многопроцессорной среде это может быть достигнуто с помощью мьютекса перекрестного процесса, такого как этот?

http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx

Есть ли какие-либо подводные камни с этим подходом?:

Таблица правды для моей реализации:

// in-cache | mutex-found
//   0            0      //not in cache, no mutex; start thread
//   1            0      //in cache, no mutex; assume thread already started (re-calculating thread could be in another process)
//   0            1      //not in cache, mutex found; thread started, do not start thread - log error (and possibly start new thread)
//   1            1      //in cache, mutex found; thread started, do not start thread

Ответы [ 2 ]

2 голосов
/ 17 сентября 2010

Короче говоря, я считаю, что это хороший подход.Единственная ловушка - идентификация мьютекса - если это вообще возможно, расскажите вторичным потокам о мьютексе по его ручке.Если необходимо использовать именованные мьютексы, вы можете присвоить мьютексу то же имя, что и вашему UUID процесса, чтобы обеспечить уникальность.

0 голосов
/ 17 сентября 2010

Если подумать, возможно, существует более простой способ сделать это. Учитывая ваше описание кеширования, которое «периодически пересчитывается», вместо того, чтобы иметь потоки, вы можете просто иметь центральный System.Threading.Timer. Поскольку он может быть связан только с одним обратным вызовом, нет риска, что несколько потоков попытаются переписать кэш. Единственное предостережение в том, что это событие таймера должно было бы выполнить одну запись в кэш-память атомарным способом (без прерывания другим потоком в середине записи).

...