这是在多线程环境中实现抢先、独占功能的正确范例吗

本文关键字:功能 范例 多线程 环境 抢先 实现 | 更新日期: 2023-09-27 18:26:53

我在多线程环境中实现了一个抢先的、独占的函数,在该环境中,如果取消请求发生,即使函数没有运行,当函数运行时,它也知道这个取消请求,并且不会运行。我在C#中使用ManualResetEvent之类的方法遇到了各种不同的方法(类似于这个问题的答案Synchronizing a Timers.Timer exposed method when stop),但我想知道像我在下面的代码中所做的这样简单的事情是否足够。我在这里介绍的是不是有一些不经意的bug?

bool cancel = false;
bool running = false;
object Lock = new object();
void PremptiveExclusiveFunction() {
  lock(Lock) {
    if(running)
      return;
    running = true;
  }
  for(int i=0; i < numIter; i++) {
    lock(Lock) {
      if(cancel) {
       cancel = false;
       running = false;
       return;
      }
    }
    // iteration code
  }
  lock(Lock) {
   running = false;
  } 
}
void Stop() {
  lock(Lock) {
    cancel = true;
  }
}

据我所知,这似乎满足了我的3个要求:
1.先发制人的能力
2.时间上的独占性,其中此功能的唯一副本可以运行
3.取消请求没有丢失,因为在PreemptiveExclusiveFunction之前调用了Stop

如果更有经验的人能指出我是否真的错过了什么,我将不胜感激。

这是在多线程环境中实现抢先、独占功能的正确范例吗

可以锁定整个函数体以消除running布尔值:

object @lock = new object();
volatile bool cancel = false;
void Function () {
    if (!Monitor.TryEnter(@lock))
        return;
    try {
        for (var i = 0; i < 100; i++) {
            if (cancel) {
                cancel = false;
                return;
            }
            // code
        }
    } finally {
        Monitor.Exit(@lock);
    }
}
void Stop () {
    cancel = true;
}

+注意volatile关键字:
http://msdn.microsoft.com/en-us/library/vstudio/x13ttww7(v=vs.100).aspx