gpt4 book ai didi

c++ - 如果一个线程在关键部分调用 Acquire(),如果另一个线程调用 Release(),该锁是否会被释放?

转载 作者:行者123 更新时间:2023-11-27 23:59:31 27 4
gpt4 key购买 nike

我正在使用 Embarcadero 的关键部分实现 TCriticalSection,但他们的文档没有回答我的问题。

如果我们有一个全局临界区对象:

namespace
{
//delphi style class must be constructed on the heap
TCriticalSection* criticalSection = new TCriticalSection();
}

//somewhere in thread 1...
criticalSection->Acquire();

//somewhere in thread2...
criticalSection->Release();

thread2中的release调用会不会打开临界区?

我问是因为我有 RAII 类,它在销毁期间释放锁,所以如果代码抛出异常,我们不会进入死锁。然而,关键部分只是方法的一部分。

//...
CRITICAL_SECTION_LOCK lock( criticalSection );
OneAtATimePlease();
lock.Release();
//...

所以我不想将关键部分放在 OneAtATimePlease() 中,因为那样我们将为代码中对该方法的每次调用处理锁。

最佳答案

“临界区”实际上是 MS Windows 的概念。如果一个线程未能解锁关键部分会发生什么是不确定的,如果另一个线程试图解锁它没有锁定的关键部分会发生什么也是不确定的。

您的建议(另一个线程解锁关键部分)是不可能的,因为 是线程局部的,即使关键部分是共享的,因此每个线程只能解锁自己的锁。

关于c++ - 如果一个线程在关键部分调用 Acquire(),如果另一个线程调用 Release(),该锁是否会被释放?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40236513/

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