C# 线程同步和中止
我在结束一个线程的工作时遇到了一个小问题。首先,这里是应用程序“布局”: 线程1-工作线程(C++/CLI)-按预期运行和终止C# 线程同步和中止,c#,multithreading,c++-cli,C#,Multithreading,C++ Cli,我在结束一个线程的工作时遇到了一个小问题。首先,这里是应用程序“布局”: 线程1-工作线程(C++/CLI)-按预期运行和终止 for(...) { try { if(TabuStop) return; System::Threading::Monitor::Enter("Lock1"); //some work, unmanaged code } finally { if(stop) { System::Threading
for(...)
{
try
{
if(TabuStop) return;
System::Threading::Monitor::Enter("Lock1");
//some work, unmanaged code
}
finally
{
if(stop)
{
System::Threading::Monitor::Pulse("Lock1");
}
else
{
System::Threading::Monitor::Pulse("Lock1");
System::Threading::Monitor::Wait("Lock1");
}
}
}
线程2-显示结果线程(C#)
我正试图从应用程序主线程关闭整个程序,如下所示:
TabuEngine.TabuStop = true; //terminates nicely the worker thread and
if (DisplayThread.IsAlive)
{
DisplayThread.Abort();
}
我也尝试过使用DisplayThread.Interrupt,但它总是阻塞Monitor.Wait(“Lock1”,5000);我无法摆脱它。这里怎么了?我应该如何执行同步并让它完成它应该做的工作
//编辑
我甚至不确定使用“Lock1”字符串的技巧是否真的有效,锁是否放在同一个对象上。这是一个很好的使用监视器进行生产者/消费者同步的例子。
有两个线程(生产者和消费者,类似于您的情况),但同步是通过引入第三类来完成的,第三类锁定共享资源。这个例子提供了完整的源代码,所以我没有在这里发布 这些是监视器,不是自动重置或手动重置事件。您需要一个条件来检查以正确使用wait。否则,如果在开始等待之前
脉冲
,您将错过脉冲
。通常情况下,模式如下所示:
线程A:
lock(x)
{
... work ....
while(!some_condition)
Monitor.Wait(x)
}
线程B:
lock(x)
{
... other work ...
some_condition = true;
Monitor.Pulse(x)
}
通过在锁定状态下操纵和检查某些条件,我们可以确保无论脉冲何时发生(在我们开始等待A之前或之后),A都能做出适当的反应,不会永远等待已经出现的脉冲。不要将字符串文字用于锁定。它们每次都可能是不同的对象。我会把它换成静态对象,或者算出其他东西。(我无法使用普通托管对象,因为部分代码位于非托管类中,更多信息如下:)谢谢,我一定会看一下。谢谢你的回答。我会试试,我希望它能奏效。
lock(x)
{
... other work ...
some_condition = true;
Monitor.Pulse(x)
}