【问题标题】:block variable for read用于读取的块变量
【发布时间】:2015-01-17 23:15:58
【问题描述】:

我有以下代码:

private DateTime lastUploadActivityTime = DateTime.Now;
private void HttpSendProgress(object sender, HttpProgressEventArgs e)
{
    // update variable
    lastUploadActivityTime = DateTime.Now;
    ......
    boolThreadAvailableTargetSiteActive = false;
}

// this method is executed in different thread, than method above
private void ThreadCheckAvailableTargetSite()
{
    while (boolThreadAvailableTargetSiteActive)
    {
        if (lastUploadActivityTime.AddSeconds(5) <= DateTime.Now)
        {
            MessageBox.Show("BREAK");
            boolThreadAvailableTargetSiteActive = false;
        }
        Thread.Sleep(500);
    }
}

我需要在第一种方法(lastUploadActivityTime = DateTime.Now;)中阻止变量 lastUploadActivityTime,以防止在第二种方法(lastUploadActivityTime.AddSeconds(5) &lt;= DateTime.Now)中读取 lastUploadActivityTime。我该怎么做? Mutex 是否帮助我防止读取变量?

【问题讨论】:

标签: c# multithreading mutex


【解决方案1】:

lock 关键字确保一个线程不进入代码的临界区,而另一个线程在临界区。如果另一个线程试图输入一个锁定的代码,它将等待、阻塞,直到对象被释放。最佳实践是定义一个私有对象来锁定,或者定义一个私有静态对象变量来保护所有实例共有的数据。

private object syncLock = new object();
private DateTime lastUploadActivityTime = DateTime.Now;
private void HttpSendProgress(object sender, HttpProgressEventArgs e)
{
    // update variable
    lock (syncLock)
    {
       lastUploadActivityTime = DateTime.Now;
    }
}

// this method is executed in different thread, than method above
private void ThreadCheckAvailableTargetSite()
{
    while (boolThreadAvailableTargetSiteActive)
    {
        lock (syncLock)
        {
           if (lastUploadActivityTime.AddSeconds(5) <= DateTime.Now)
           {
               MessageBox.Show("BREAK");
               boolThreadAvailableTargetSiteActive = false;
           }
        }
        Thread.Sleep(500);
    }
}

【讨论】:

  • 锁变量应该是引用类型:)
  • lock 关键字确保一个线程不进入代码的临界区,而另一个线程在临界区。如果另一个线程试图输入一个锁定的代码,它将等待、阻塞,直到对象被释放。
  • 请澄清 变量 没有被锁定,而是代码区域,并且有必要识别所有可以读取变量的代码区域,并锁定它们,因此值使用属性来访问这些变量。
  • 另外,我应该将 boolThreadAvailableTargetSiteActive 声明为私有 volatile bool boolThreadAvailableTargetSiteActive = true; ?
【解决方案2】:

mutex 将是多余的,在这两种方法中都使用 lock 来同步读取 http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 2023-04-07
    • 2012-05-21
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多