C# 中忙于等待的简单示例
本文关键字:简单 等待 于等待 | 更新日期: 2024-11-08 04:59:57
我正在学习C#语言,我是初学者。
我想通过使用 C# 语言中的线程来实现繁忙的等待。
我之前已经阅读了下面的链接,但是有一个C语言示例代码:
http://en.wikipedia.org/wiki/Busy_waiting
您提供的链接几乎可以直接转换为 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);
}
}
}
}
重申一下,这不是旋转锁,但应该实现相同的结果。