请你帮我提醒我一个最简单的并行编程技术。
如何在C#中执行以下操作:
semaphore counter = 0
// Block until semaphore is signalled
semaphore.Wait(); // wait until semaphore counter is 1
// Allow thread 1 to run:
semaphore.Signal(); // increments from 0 to 1
它不是互斥体,因为没有关键部分,或者你可以说有一个无限的关键部分。那是什么?
答案 0 :(得分:2)
重新“如何”......好吧,您可以使用Semaphore,Mutex或重置事件(ManualResetEvent,AutoResetEvent),但我个人使用{ {1}}为此;
Monitor
主题1:
object sync = new object();
主题2:
lock(sync) { // blocks until it successfully takes (re-entrant) lock on sync
// here: launch thread 2, to ensure thread 1 has the lock first
Monitor.Wait(sync); // releases lock(s) and waits for pulse,
// then retakes locks(s) when free
} // releases lock (or decrement by 1)
答案 1 :(得分:1)
你写的只是一个互斥体;互斥锁与值为1的信号量基本相同。是一个“临界区” - 它是在任一线程持有互斥锁时执行的代码序列。
答案 2 :(得分:1)
信号量初始化为1,可以被视为[读取:使用]作为互斥锁。 您描述的具体方案是信号量在两个线程之间使用信号系统。 第一个线程试图锁定资源[获取信号量]但被阻塞[因为信号量已被初始化为零],直到第二个线程发出信号线程1他可以输入代码的剩余部分。 关于该主题的优秀文章是:
http://geekswithblogs.net/shahed/archive/2006/06/09/81268.aspx