这是在多线程环境中实现抢先、独占功能的正确范例吗
本文关键字:功能 范例 多线程 环境 抢先 实现 | 更新日期: 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