【问题标题】:lock-less technique to pass double update from one thread to another无锁技术将双重更新从一个线程传递到另一个线程
【发布时间】:2012-07-09 22:51:05
【问题描述】:

假设我共享了@98​​7654322@ 变量。线程A 每秒更新数千次。在另一个线程B 中,每次发生这种情况时,我都希望以某种方式收到有关“更新”的通知。

我试图完全避免通知,只使用while(true) 循环,但这会显着降低我的程序lock-free calc: how to sum N double numbers that are changing by other threads? 的速度,这可能是因为“同时你不断地从内存中加载同一个数组,这并不是真的对性能有好处,因为内存带宽有限。”

我也尝试过使用Monitor 类,但它也很慢,当Monitor.TryEnter 返回false 时,我发现最多延迟 1-2 毫秒。

我现在认为我需要使用无锁技术进行通知,可能使用SpinLock 或其他方式?

【问题讨论】:

    标签: c#


    【解决方案1】:

    使用等待句柄在线程之间进行通知

        System.Threading.AutoResetEvent are = new System.Threading.AutoResetEvent(false);
        double d = 0;
        public void ThreadA(object state)
        {
            while (true)
            {
                d++;
                are.Set();
            }
        }
    
        public void ThreadB(object state)
        {
            while (true)
            {
                are.WaitOne();
                double current = d;
            }
        }
    

    【讨论】:

    • 我喜欢这样,但问题是AutoResetEvent 引入了多少开销。
    • 我没有对此进行测试。您可以测试代码块进行 1000 次迭代并检查执行这些迭代所花费的时间,然后使用锁定检查相同的迭代。那么你就可以知道结果了。
    【解决方案2】:

    不要一直保持通知线程。当线程 A 改变值时,他应该通知线程 B 并继续前进。

    【讨论】:

      猜你喜欢
      • 2019-09-16
      • 1970-01-01
      • 2022-01-09
      • 2013-01-26
      • 1970-01-01
      • 2015-06-12
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多