如何在线程之间传输锁?

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


usr*_*usr 5

您可以使用互斥锁.它们就像锁,但具有更多功能.它们也更贵.

你肯定已经知道,你在这里处于危险的境地.跨越线程传递锁是危险的......


Tud*_*dor 5

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)