gpt4 book ai didi

c# - SignalAndWait用于锁定上下文

转载 作者:行者123 更新时间:2023-12-03 13:22:41 25 4
gpt4 key购买 nike

我有一个管理器类,它为线程池生成任务,每个线程应该在完成后立即进行回调。

我使用锁来处理变量和字段,并使用信号来处理线程间通信。我正在寻找的是一种退出当前lock()并自动等待信号的方法,类似于SignalAndWait,但需要使用locks()。

代码看起来像这样:

// ... part of the scheduler
foreach(WorkTask task in worktasks)
{
lock(_syncObj)
{
new Job(task, myCallback); // creates a thread
instanceCount++;
while(instanceCount > _maxConcurrentTasks)
_resetEvent.WaitOne(Timeout.Infinite);
}
}

// .. the callback

void myCallback()
{
lock(_syncObj)
{
instanceCount--;
_resetEvent.Set();
}
}

这里的问题是.WaitOne()不会退出lock(),因此执行回调的任何线程都将死锁。

我对WaitOne(Int32,bool exitContext)寄予了厚望,但该上下文似乎是关于远程处理和东西的,而不是同步的。

最佳答案

有什么理由使用事件原语而不是Monitor.Wait/Pulse/PulseAll吗? Monitor.Wait原子性地释放锁并等待,然后在锁返回之前重新获得该锁。有关更多详细信息,请参见my threading article

关于c# - SignalAndWait用于锁定上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/301960/

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