下面的多线程变量访问如何实现?

问题描述 投票:0回答:1

我有两个正在连续执行的任务(TaskA 和 TaskB)。 TaskA 首先检查是否有来自 TaskB 的请求,如果有则处理它并继续前进。 TaskB 首先向 TaskA 发送请求,并在成功接收到请求后进行处理。我有以下伪代码:

class RequestLock
{
   public volatile bool Request;
   public string Data;
}

classA
{
   public void Run(RequestLock req)
   {
       while (true)
       {
           if (req.Request)
           {
              req.Data = "something"
              req.Request = false;
           }

           this.doSomething();
       }
   }
}

classB
{
   public void Run(RequestLock req)
   {
       while (true)
       {
           req.Request = true
           while (req.Request)
           {
              sleep(10);
           }

           # access req.Data
       }
   }
}

有没有更好的方法来实现这个目标?

c# multithreading thread-safety
1个回答
0
投票

是的。

您显示的代码将无法可靠地工作。但幸运的是,.NET 有很多内置类可以帮助您完成此任务,其中一些已被提及:

BlockingCollection
(添加项目并等待它们被处理),或
ConcurrentQueue
(处理先入项目) -先出队列,无需手动锁定)为您处理大部分工作。如果你想手动实现队列,至少使用 Semaphore 或 AutoResetEvent。

© www.soinside.com 2019 - 2024. All rights reserved.