gpt4 book ai didi

c# - 生产者-消费者示例,都在 lock(this) block 中

转载 作者:行者123 更新时间:2023-11-30 19:46:41 25 4
gpt4 key购买 nike

我正在看这个 msdn 上的示例 2有关使用 Monitor.Pulse() 进行线程同步的页面。

一个 Cell 对象被创建并传递给生产者和消费者对象。

Cell cell = new Cell( );
CellProd prod = new CellProd(cell, 20);
CellCons cons = new CellCons(cell, 20);

分别为这两个线程创建一个线程

Thread producer = new Thread(new ThreadStart(prod.ThreadRun));
Thread consumer = new Thread(new ThreadStart(cons.ThreadRun));

ThreadRun 在每种情况下都是一个循环,根据消费者/生产者调用 Cell.ReadFromCell() 或 Cell.WriteToCell()。比如生产者这样做

public void ThreadRun( )
{
for(int looper=1; looper<=quantity; looper++)
cell.WriteToCell(looper); // "producing"
}

我不明白的一点是,在这些方法中的每一个中,它们都以

开头
lock(this)

而且由于传递给两者的是同一个 Cell 对象(即上面 lock 语句中的“this”),我原以为这段代码中一次只能有一个线程。然而,从后面的 Monitor.Pulse() 和 Monitor.Wait() 代码来看,两个线程似乎同时位于这些部分中。如果一个线程获得了锁并触发了 Monitor.Wait(),那么另一个线程将永远无法 Pulse,因为它在等待锁时被阻塞。

我猜有一个简单的解决方案,但我误解了一些东西,从我运行代码的测试来看,两个线程似乎同时处于临界区,所以 lock(this) 没有执行我的印象是它应该做什么。

最佳答案

您缺少的是 Monitor.Wait(this)释放 this 上的锁,直到它被唤醒。所以,是的,您的消费者线程看起来就像它在锁中,因此拥有它,但实际上它暂时释放了它。

来自 the docs :

When a thread calls Wait, it releases the lock on the object and enters the object's waiting queue. The next thread in the object's ready queue (if there is one) acquires the lock and has exclusive use of the object. All threads that call Wait remain in the waiting queue until they receive a signal from Pulse or PulseAll, sent by the owner of the lock. If Pulse is sent, only the thread at the head of the waiting queue is affected. If PulseAll is sent, all threads that are waiting for the object are affected. When the signal is received, one or more threads leave the waiting queue and enter the ready queue. A thread in the ready queue is permitted to reacquire the lock.

关于c# - 生产者-消费者示例,都在 lock(this) block 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8184227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com