C# 中忙于等待的简单示例

本文关键字:简单 等待 于等待 | 更新日期: 2024-11-08 04:59:57

我正在学习C#语言,我是初学者。

我想通过使用 C# 语言中的线程来实现繁忙的等待。

我之前已经阅读了下面的链接,但是有一个C语言示例代码:

http://en.wikipedia.org/wiki/Busy_waiting

C# 中忙于等待的简单示例

您提供的链接几乎可以直接转换为 C#。忙碌等待(或旋转锁)在 void *f1(void *p) 中实现。这可以转换为 C#,如下所示:

static void f1()
{
    while (i == 0)
    {
    }
    Console.WriteLine("i's value has changed to {0}.", i);
    return;
}

我建议不要使用手工制作的旋转锁,除非您绝对确定自己在做什么。如果需要对变量的独占访问权限,请使用 lock 关键字标记使用该变量的关键代码部分。

Joe Albahari 发布了一篇关于线程的优秀且免费的介绍。我强烈建议阅读本文以更好地了解线程和线程同步。

所以pixelbadger为你发布了一个实际的旋转锁代码。 请注意,这会将您的 CPU 使用率提高到 100%,因为您的 while 循环会尽可能快地运行。 (根据我对它们的了解,这是所有自旋锁的问题。 我从来不知道他们的名字。

首选方法是在值更改时收到通知。 为此,请看这个:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Sandbox
{
    class Program
    {
        // some random object to lock on
        private static Object objLock;
        // the value we want to read
        private static int value;
        // entry point
        static void Main(string[] args)
        {
            value = 0;
            objLock = new Object();
            // Backgrond worker runs on a new thread.
            BackgroundWorker bgw = new BackgroundWorker();
            // tells the background worker object that when it is run, it should execute the bgw_DoWork method below.
            bgw.DoWork += bgw_DoWork;
            // runs the background worker
            bgw.RunWorkerAsync();
            getValue();
            Console.ReadKey();
        }
        private static void getValue()
        {
            // lock on our lock object so that no other thread can execute code that locks on the same object
            lock (objLock)
            {
                // Relinquishes the lock on our lock object.  This thread starts blocking ("paused")
                Monitor.Wait(objLock);
            }
            // Since the monitor Pulse(), we can continue execution.
            Console.WriteLine(value); // prints out 10 after the 2 second delay
        }
        static void bgw_DoWork(object sender, DoWorkEventArgs e)
        {
            System.Threading.Thread.Sleep(2000); // some long operation that calculates the new value
            // this locks on our lock object.  since we Wait() on the objlock in getValue(), the lock is available and we
            // can continue executing this code.
            lock (objLock)
            {
                value = 10;
                // This tells the thread executing getValue() that it may continue.
                Monitor.Pulse(objLock);
            }
        }
    }
}

重申一下,这不是旋转锁,但应该实现相同的结果。