本文介绍了是安全的使用布尔标志从在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#停止运行一个线程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-26 11:59