Jad*_*ias 2 .net c# concurrency multithreading locking
我想要
Monitor.Enter(this.StaticLock);
try
{
// Do something ...
ThreadPool.QueueUserWorkItem(state =>
{
try
{
// Do something else...
}
finally
{
Monitor.Exit(this.StaticLock);
}
});
}
catch (Exception)
{
Monitor.Exit(this.StaticLock);
throw;
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为它Monitor.Exit不能Monitor.Enter在当前线程中不存在的对象上.怎么做?我应该使用线程间通信吗?
Eri*_*ert 14
如何在线程之间传输锁?
你在初始线程上输入监视器,比如线程Alpha.尝试进入监视器的任何其他线程将阻塞,直到监视器可用.
如果你想将锁转移到另一个线程,比如线程Bravo,同时仍然能够在Bravo完成时恢复具有监视器所有权的线程Alpha ,那么你将Alpha置于监视器上的等待状态.如果显示器上的线程Bravo被阻挡,则它会唤醒并进入显示器.当它完成它脉冲监视器,它放弃了监测和所有权转移的Bravo的所有权回阿尔法,唤醒并不断与它的显示器的所有权运行.
如果你完全不清楚,那么(1)你不应该首先尝试这样做; 如果你弄错了,这是非常危险的,(2)你应该读到这个:
http://www.codeproject.com/Articles/28785/Thread-synchronization-Wait-and-Pulse-demystified
Semaphore允许您将它们锁定在一个线程中并在另一个线程中解锁它们.
但是这种行为对我来说非常可疑......你究竟想要完成什么?这几乎不应该在实践中完成.
static readonly Semaphore semaphore = new Semaphore(1, 1);
void Method1()
{
semaphore.WaitOne();
try
{
// Do something ...
new Thread(() =>
{
try
{
// Do something else...
}
finally
{
semaphore.Release();
}
}).Start();
}
catch (Exception)
{
semaphore.Release();
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1650 次 |
| 最近记录: |