本文介绍了是安全的使用布尔标志从在C#停止运行一个线程的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我主要关注的是布尔标志......是安全的使用它没有任何同步?我在几个地方看,它的原子(包括文档)。
类MyTask
{
私人的ManualResetEvent startSignal;
私人CountDownLatch闩锁;
私人布尔运行; MyTask(CountDownLatch闩锁)
{
运行= FALSE;
this.latch =锁存器;
startSignal =新的ManualResetEvent(假);
} //它运行在一个线程的方法
公共无效的run()
{
startSignal.WaitOne();
而(运行)
{
startSignal.WaitOne();
// ...一些code
}
latch.Signal();
} 公共无效停止()
{
运行= FALSE;
startSignal.Set();
} 公共无效启动()
{
运行= TRUE;
startSignal.Set();
} 公共无效暂停()
{
startSignal.Reset();
} 公共无效简历()
{
startSignal.Set();
}
}
这是一种安全的方式来设计这样一个任务?任何建议,改进意见?
注:我写了我的自定义 CountDownLatch
类的情况下,你想知道我是从得到它
更新:结果
这里是我的CountDownLatch太:
公共类CountDownLatch
{
私人挥发性INT m_remain;
私人的EventWaitHandle m_event; 公共CountDownLatch(诠释计数)
{
如果(计数℃,)
抛出新ArgumentOutOfRangeException();
m_remain =计数;
m_event =新的ManualResetEvent(假);
如果(m_remain == 0)
{
m_event.Set();
}
} 公共无效信号()
{
//最后一个线程还对信号设置事件。
如果(Interlocked.Decrement(REF m_remain)== 0)
m_event.Set();
} 公共无效等待()
{
m_event.WaitOne();
}
}
解决方案
您更好地标记它的虽然:
But I would change your loop:
startSignal.WaitOne();
while(running)
{
//... some code
startSignal.WaitOne();
}
As it is in your post the 'some code' might execute when the thread is stopped (ie. when Stop is called) which is unexpected and may be even incorrect.
这篇关于是安全的使用布尔标志从在C#停止运行一个线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!