Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 线程同步和中止_C#_Multithreading_C++ Cli - Fatal编程技术网

C# 线程同步和中止

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

我在结束一个线程的工作时遇到了一个小问题。首先,这里是应用程序“布局”:

线程1-工作线程(C++/CLI)-按预期运行和终止

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)
}