拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 了解C#中的信号量

了解C#中的信号量

白鹭 - 2022-01-23 2129 0 0

我试图理解用C#撰写的一段代码

static Semaphore _transactionReceived;
static TransactionsSession _transactionsSession;

static void StartTransactionsStream()
{
    WriteNewLine("Starting transactions stream ...");

    _transactionsSession = new TransactionsSession(AccountID);
    _transactionReceived = new Semaphore(0, 100);
    _transactionsSession.DataReceived  = OnTransactionReceived;

    _transactionsSession.StartSession();

    bool success = _transactionReceived.WaitOne(10000);

    if (success)
        WriteNewLine("Good news!. Transactions stream is functioning.");
    else
        WriteNewLine("Bad news!. Transactions stream is not functioning.");
}

但我无法理解代码周期中发生的与Sempahore有关的事情,特别是以下几行正在做的事情:

_transactionReceived = new Semaphore(0, 100);

_transactionReceived.WaitOne(10000)

是在做。

我已经查看并(重新)查看了System.Threading.Semaphore 档案,我看到建构式“初始化信号量类的新实体,指定初始条目数和最大并发条目数”。 但是有0条目是什么意思呢?

此外,我看到WaitOne(int32)呼叫“阻塞当前执行绪,直到当前 WaitHandle 收到信号,使用 32 位有符号整数指定时间间隔(以毫秒为单位)。” 但同样,WaitOne在代码回圈的背景关系中意味着什么

关于这是如何执行的任何指标或一般评论都会有所帮助。非常感谢!

uj5u.com热心网友回复:

正是这样;Semaphore目前还没有项目了最大的100。

如果你Semaphore用 with构造了new Semaphore(1, 100);,那么就会有 1 个条目,另外还有 99 个。

需要Semaphore.Release()有 100 个剩余条目。

如果Semaphore有可用条目,即当前条目数不是 100,则它true立即回传

否则,它会阻塞当前执行绪,直到一个条目可用(可能由另一个执行绪呼叫Semaphore.Release()),此时该方法回传true

如果您指定 a int millisecondsTimeout,则这是Semaphorewill 阻止并等待条目被释放的最长时间

如果超过该超时,则该方法回传false

uj5u.com热心网友回复:

信号量说明

ASemaphore是一个同步物件,它允许在代码段中进行有限程度的并行。

为简单起见,假设您正在代码块(没有共享实体、全域变量或其他邪恶)上实体化一个全新的信号量。由于多个执行绪可以同时执行同一段代码,信号量保证只有x它们中的一个可以同时执行同一个块。

将执行绪视为工人。并非巧合,执行绪通常被称为作业执行绪

信号量处于红色状态,因此在某个执行绪解锁信号量之前,没有人可以执行特定的代码部分您可以创建一个 GUI,其中多个执行绪为相同的操作竞争,但是通过按下按钮,您可以解锁信号量并允许一个执行绪运行。

这意味着发生以下情况之一:

  • 信号量处于绿色状态,即有许可。执行绪不等待,信号量递减,操作继续
  • 信号量处于红色状态,即没有可用的许可
    • 无论是WaitOne等待10秒(10000ms),因为没有许可证是在这段时间内可用
    • 或者其他人解锁信号量和呼叫的执行绪WaitOne是好的

关于你的代码

必须有一些其他方法可以释放信号量,但在示例中未显示。事实上,你有一个红色的信号量在那里等待,但显然没有人释放它。我相信这两行之一隐藏了一个Semaphore.Release方法

 _transactionsSession.DataReceived  = OnTransactionReceived;

 _transactionsSession.StartSession();
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *