我主要关心的是布尔标志......在没有任何同步的情况下使用它是否安全?我在几个地方读到它是原子的(包括文档)。
class MyTask
{
private ManualResetEvent startSignal;
private CountDownLatch latch;
private bool running;
MyTask(CountDownLatch latch)
{
running = false;
this.latch = latch;
startSignal = new ManualResetEvent(false);
}
// A method which runs in a thread
public void Run()
{
startSignal.WaitOne();
while(running)
{
startSignal.WaitOne();
//... some code
}
latch.Signal();
}
public void Stop()
{
running = false;
startSignal.Set();
}
public void Start()
{
running = true;
startSignal.Set();
}
public void Pause()
{
startSignal.Reset();
}
public void Resume()
{
startSignal.Set();
}
}
以这种方式设计任务是否安全?有什么建议、改进、意见吗?
注意:我写了我的自定义CountDownLatch
类,以防你想知道我从哪里得到它。
Update:
这也是我的 CountDownLatch:
public class CountDownLatch
{
private volatile int m_remain;
private EventWaitHandle m_event;
public CountDownLatch (int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException();
m_remain = count;
m_event = new ManualResetEvent(false);
if (m_remain == 0)
{
m_event.Set();
}
}
public void Signal()
{
// The last thread to signal also sets the event.
if (Interlocked.Decrement(ref m_remain) == 0)
m_event.Set();
}
public void Wait()
{
m_event.WaitOne();
}
}
你最好标记一下volatile http://msdn.microsoft.com/en-us/library/x13ttww7%28VS.80%29.aspx though:
volatile 关键字表示
字段可能被多个修改
并发执行线程。领域
声明为 挥发性 的不是
受编译器优化的影响
假设由单线程访问。这
确保最新的值
始终出现在现场。
但我会改变你的循环:
startSignal.WaitOne();
while(running)
{
//... some code
startSignal.WaitOne();
}
正如您的帖子中所示,“某些代码”可能会在线程运行时执行stopped(即,当调用 Stop 时)这是意外的,甚至可能是不正确的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)