我有多个线程共享信号量的使用。线程 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
我怀疑我将使用 Aaron 解决方案的变体。我主要希望有一些更优雅的解决方案可用,但我怀疑就像这个项目的其他一切一样,这都是蛮力和极端情况:-(。