输入关键部分不锁定
EnterCriticalSection doesn't lock
这是我的代码的一小部分:
CRITICAL_SECTION _cs;
InitializeCriticalSection(&_cs);
void lock() {
if (_initizalized){
EnterCriticalSection(&_cs);
EnterCriticalSection(&_cs);
_locked = true;
}
}
(我写了两次"EnterCriticalSection",因为我注意到这一行不起作用)据我所知,这一定会造成僵局。但事实并非如此。为什么?
没有同一个线程可以随心所欲地进入它。CRITICAL_SECTION用于限制多个不同线程之间的访问。
EnterCriticalSection允许从同一线程进行递归调用。来自文件:
在线程拥有关键部分的所有权后,它可以对EnterCriticalSection或TryEnterCriticalSection的其他调用而不阻止其执行。这样可以防止线程在等待它的关键部分时死锁已经拥有。线程每次都进入关键部分EnterCriticalSection和TryEnterCriticalSection成功。一根线每次进入时都必须调用LeaveCriticalSection一次关键部分。
正如MSDN所说,
线程拥有关键节的所有权后,可以对EnterCriticalSection或TryEnterCriticalSection进行额外调用,而不会阻止其执行。这样可以防止线程在等待它已经拥有的关键部分时发生死锁。每次EnterCriticalSection和TryEnterCriticalSection成功时,线程都会进入关键部分。线程每次进入关键节时都必须调用LeaveCriticalSection一次。
相关文章:
- 使用一个考虑到std::map中键值的滚动或换行的键
- 如何找到锁定Linux futex的C++行
- G锁定铸造到基础上会释放模拟行为
- 如何在c++中只将键插入到bimap的一侧
- 使用2个键的cpp-stl::优先级队列排序不正确
- 有效地使用std::unordered_map来插入或增加键的值
- 如何检查线程是否锁定
- C++映射有2个键,这样任何1个键都可以用来获取值
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 我应该在锁定TBitmap画布后解锁它吗
- 智能指针作为无序映射键,并通过引用进行比较
- 带有数组键C++的二进制映射
- 如何将部分流作为参数传递
- 使用 GLUT 使用键停止动画?
- 无法添加多个键以映射将结构作为键
- 将 std::set 与基于键的比较器一起使用
- 如何使用 std::variant 打印地图键/值?
- C++在WM6.1上锁定标签栏,但也锁定窗口键
- 我如何打开/关闭大写锁定,滚动锁定,数字锁定键编程
- QML - 一键锁定/解锁屏幕方向(安卓和最终的 ios)