У меня есть несколько потоков, которые совместно используют семафор. Поток A содержит семафор (используя блокировку), а потоки B и C ожидают этого же семафора (также используя блокировку). Потоки имеют глобальные переменные и т. Д.
Есть ли в C # техника, которую я могу использовать, чтобы закрыть поток B? Я могу установить флаг в A, и поток B проверит этот флаг и завершит работу, как только он получит контроль над семафором, но я не знаю какой-либо техники, позволяющей потоку A передавать семафор потоку B (и получать его). назад при выходе из нити B) без риска захвата нити C.
Кто-нибудь есть какие-либо предложения, как решить эту проблему дизайна? Я могу переписать программу по мере необходимости, если я подхожу к этому неправильно.
[Изменить]
Комментатор указал, что я использую неправильную терминологию. Комментатор правильный - я использую критическую секцию, но, учитывая, что все выполняется в одном процессе, в этом примере критические секции функционально эквивалентны более общему термину «семафор».
[Изменить]
Кто-то попросил более подробную информацию, так что вот оно.
Может быть несколько потоков, выполняющих код A. Существует только один поток, выполняющий код B.
Код A:
private static Thread workerThread = null;
lock (lockObject)
{
... do some work ...
if (...condition...)
{
if (workerThread != null)
{
// Kill the worker thread and continue only after it is dead.
quitWorkerThread = true;
// Wait for the thread to die.
while (workerThread.IsAlive)
{
Thread.Sleep(50);
}
workerThread = null;
quitWorkerThread = false;
} // if (workerThread != null)
} // if (...condition...)
... do some more work ...
if (...condition...)
{
if (workerThread == null)
{
// Start the worker thread.
workerThread = new Thread(WorkerThread);
workerThread.Start();
} // if (workerThread == null)
} // if (...condition...)
... do even more work ...
} // lock (lockObject)
Код B:
private void WorkerThread()
{
while (true)
{
if (quitWorkerThread)
{
return;
}
Thread.Sleep (2000);
if (quitWorkerThread)
{
return;
}
lock(lockObject)
{
if (quitWorkerThread)
{
return;
}
... do some work ...
} // lock(lockObject)
} // while (true)
} // WorkerThread
Я подозреваю, что вариант решения Аарона будет тем, что я использую. Я больше всего надеялся, что появилось несколько более элегантное решение, но я подозреваю, что, как и все остальное в этом проекте, все это грубая сила и угловые случаи: - (.