问题标签 [critical-section]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Boost 的作用域互斥锁和 WinAPi 的临界区有区别吗?
在 Windows 环境中,Boost 的作用域互斥锁是使用 WinAPI 的关键部分还是其他什么?
c++ - 应用验证程序报告“线程不能拥有关键部分”。
所以 App Verifier 抛出了这个异常。据我所知,这条消息的文字有点误导。问题似乎是临界区是由在临界区被销毁之前被销毁的线程创建的。
这是一个相对简单的修复,但有谁知道除了创建线程之外的线程破坏关键部分的后果是什么?有多危险?只是担心临界区句柄会“泄漏”还是有更隐蔽的副作用?
其他一些信息:
- 用 C++ 编写的应用程序(当然是在 Windows 上)
- 使用 InitializeCriticalSelection 创建的临界区
- 最终使用 DeleteCriticalSection 删除临界区
c++ - 仅使用关键部分的 Win32 读/写锁
作为工作项目的一部分,我必须使用 Win32 api 在 C++ 中实现读/写锁。所有现有的解决方案都使用在执行期间需要上下文切换的内核对象(信号量和互斥体)。这对我的应用程序来说太慢了。
如果可能的话,我想只使用关键部分来实现一个。锁不必是进程安全的,只有线程安全的。关于如何解决这个问题的任何想法?
windows-vista - Windows 2003 SP2 的线程匮乏
令我们大吃一惊的是,我们最近发现了这个。对于 Windows 2003 的 SP1,Microsoft 改变了临界区的行为方式。想要访问它们的早期线程以 FIFO 方式提供服务。现在,它们以纯粹的“随机”方式提供服务。
在我们的例子中,我们有这样的事情:
因此,随着 2003 SP2 中关键部分的新实现,AddToList 可能会死于饥饿,因为无法保证它会被唤醒。
这个例子有点极端,但另一方面,我有数百万行代码是在假设对关键部分的访问是序列化的情况下编写的。
有没有办法关闭这个新的关键部分?
编辑:由于无法返回旧版本,我正在考虑只进行全局搜索和替换以将 {Enter,Leaver}CriticalSection 更改为 My{Enter,Leave}CriticalSection。您是否知道应该如何实现它以使其行为与 SP2 之前的版本完全一样?
process - N个进程和M类进程——进入和退出cs
我被要求写:以下情况的输入函数和退出函数:
有 N 个进程和 M 种进程(N>>M) 有一个临界区,所有相同类型的进程都可以进入。例如:如果A类型在cs中,则B类型不能进入cs。但所有类型为 A 的进程都可以进入。
我只能使用互斥锁和“类型”,这是进程的类型。不允许死锁。
你觉得这样好吗?
谢谢!(顺便说一句,这不是硬件。我有考试,我正在解决前几年的考试)
c++ - 如何使用函数在 C++ 中初始化静态成员
我正在使用 C++。
在.h
:
在.cpp
:
但我想用
在一个静态函数中。我该如何调用InitializeCriticalSection(PCRITICAL_SECTION pcs);
?
我可以使用以下一个:
DeleteCriticalSection(&g_CS)
应用离开后如何调用?
使用 MFC,似乎 CCriticalSection 是一个解决方案。
c++ - CRITICAL_SECTION 和 CCriticalSection 之间的关系是什么
CRITICAL_SECTION 和 CCriticalSection 之间的关系是什么。CCriticalSection 是 CRITICAL_SECTION 的包装吗?
顺便提一句:
我认为下面的代码是没有意义的,因为 cs 不是全局的,它每次在 lock() 之前都是初始的,所以它不能锁定 XXX ,是吗?
非常感谢!
c - 多生产者/消费者和临界区代码问题
我正在尝试 C 中的多生产者/消费者问题,但它没有按预期工作。以下是一些代表我的实现的伪代码。
但是,使用此解决方案,data1 将被填满,但 thread2 将锁定并且永远不会运行。我的实现有问题吗?
编辑#1
我发现的问题之一是我的第二个互斥锁没有正确创建。我不知道它有什么问题,所以我只是对所有线程使用第一个互斥锁。为了让它正常工作,我还做了一些其他的事情,所以稍后我会更新我的伪代码以反映这一点。
assembly - 禁用硬件和软件中断
是否可以使用 ASM/C/C++ 程序禁用所有中断以完全控制处理器?
如果是 - >如何?
如果不是->“原子”操作系统调用如何工作(例如进入关键部分)?
谢谢你的帮助!
operating-system - 关于临界区算法的问题
操作系统概念第6 版提出了一种简单的算法来实现关键部分。
注意,Pi 是标识符为 i 的进程,Pj 是标识符为 j 的进程。为了简化问题,本书将 i,j 限制为 0 和 1,这两个进程是环境相同的。
问题1是,该算法是否违反了关键部分解决方案的三个要求之一 的进度要求?
在我看来,当 Pi 在它的剩余部分时,它不能参与决定 Pj 是否可以进入临界区。那么它是绑定到要求的。
或者我对进度要求的理解是完全错误的。所以如果 Pi 从剩余部分退出,它不能立即进入关键部分,这个 alg 违反了规则。
问题2,
如果 turn == 0 并且 P1 准备进入其临界区,P1 不能这样做,即使 P0 可能在其剩余部分
这句话的含义是什么?据我所知,我无法理解为什么 turn == 0 和 p0 在其剩余部分可以同时存在......
那么这个说法有错吗?