问题标签 [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.

0 投票
1 回答
953 浏览

c++ - 如何在两个类之间共享单个关键部分

对于在不同类层次结构中的两个类之间共享相同关键部分对象的问题,我很难找到正确的设计解决方案。

想象:

现在,对 method_one() 和 method_two() 的调用应该是同步的。我碰巧使用critical_section 对象进行同步,但想知道我应该怎么做。

我设法弄清楚了一些想法:

  1. BADcritical_section m_cs; - 创建A 或 B 的合适成员 ( ),以及
    a) 从 IA 向下转换到 A(或分别从 IB 到 B),并使用它
    b) 使其成为静态,并调用A::m_cs(or B::m_cs)

  2. 更好- 创建额外的单例对象/结构来管理critical_section对象并提供对它的访问:

    /li>

不幸的是,我对这些都不满意,并认为有人可能有更好的主意。

在这种情况下,如何在两个类之间共享单个关键部分?

0 投票
2 回答
581 浏览

synchronization - Windows 2003 SP1 中的关键部分行为更改

今天我在MSDN中遇到了这个:

每个线程使用一个来表示它已准备好让另一个线程继续进行。消费者线程在进入临界区之前将等待生产者发出其事件信号,而生产者线程将在进入临界区之前等待消费者线程发出其事件信号。在每个线程离开临界区后,它会发出信号来释放另一个线程。”

一开始我还以为WTF?!- 我一直认为线程会按照它们尝试获取临界区的顺序来获取它。尽管这对于 Service Pack 的行为来说似乎是一个奇怪的大变化,但我相信该 Service Pack 是针对 Windows Server Edition 的,而当时 Vista 正在开发中。

无论如何,这有点道理——这样调度程序旋转到的下一个等待线程将是下一个获得关键部分的线程,至少我假设。因此,这是唯一有意义的事情,除非他们决定为了好玩而随机选择;)。

尽管如此,这是我所做的假设,现在正在评估我的代码以确保没有任何依赖 FIFO 的情况是问题。

有没有人对此有任何现实世界的问题?虽然线程获取临界区的顺序不保证是先进先出,但通常不是先进先出吗?如果通常不是FIFO(或接近 FIFO),有谁知道线程可以等待激烈竞争的关键部分多长时间?如果它是一个低优先级线程,这是否意味着如果总是有一个更高优先级的线程试图获取临界区,它可以无限期地等待(即使如果遵循 FIFO,低优先级线程很久以前是下一个线程)? 是否有安全措施来防止这种情况,或者是否强制要求依赖辅助同步对象?

当然,这真的只在竞争激烈的关键部分才重要。

我不知道,也许我做的太多了……但是这件事让我很困扰。任何见解都值得赞赏。谢谢 ;)

0 投票
1 回答
597 浏览

boost - 提升中的 CRITICAL_SECTION?

有什么东西可以转化为 windowsCRITICAL_SECTION吗?
CRITICAL_SECTION是一个所谓的“用户模式”互斥锁,它使用自旋锁而不是阻塞,并避免昂贵的内核转换。

0 投票
4 回答
15240 浏览

c++ - Mutex 示例中未处理的异常/访问冲突写入位置

我正在研究使用互斥锁保护全局双精度的示例,但是出现错误-

Lab7.exe 中 0x77b6308e 处的未处理异常:0xC0000005:访问冲突写入位置 0x00000068。

我认为这与访问分数有关?(全球双标)

更新:

在解决了将循环设置为 1000 而不是 10 的问题后,错误仍然发生,但是当我注释掉引用互斥锁的代码时,错误没有发生。

更新 2

线程按照惯例返回 0(这是漫长的一周!)

我尝试重新添加与互斥锁相关的代码,程序将编译并运行良好(当然除了双精度的竞争条件问题),CRITICAL_SECTION、InitializeCriticalSection 和 DeleteCriticalSection 全部重新添加。问题似乎与 EnterCriticalSection或 LeaveCriticalSection,因为当我添加它们时错误再次发生。

0 投票
2 回答
2630 浏览

linux-kernel - 当内核代码被中断时会发生什么?

我正在阅读操作系统概念(Silberschatz,Galvin,Gagne),第 6 版,第 20 章。我了解 Linux 内核代码是不可抢占的(2.6 版本之前)。但它可以被硬件中断中断。如果内核处于临界区的中间并且发生了中断并且它也执行了临界区会发生什么?

从我在书中读到的:

Linux 使用的第二种保护方案适用于中断服务程序中出现的临界区。基本工具是处理器中断控制硬件...

好的,当 ISR 具有临界区时使用此方案。但它只会禁用进一步的中断。首先被这个中断中断的内核代码呢?

0 投票
3 回答
2754 浏览

c++ - 使用相同的临界区对象进行读写

我需要编写一个读取和写入文件的类。当我执行写操作时,不应该发生读取,反之亦然。我可以为此使用单个关键部分对象吗?像这样:

FileWorker.h

FileWorker.cpp

谢谢。

0 投票
2 回答
179 浏览

c++ - 从 Webservice 访问 C++ COM dll

我正在使用来自 Web 服务的 COM dll。COM dll 被添加为参考。我在 Global.asax 中将对象声明为静态的。我正在 Application_Start 中创建 COM 对象。

我必须在每个请求中调用 COM dll 接口函数。我在这里遇到异常,因为内存损坏。我可以看到同时请求出现时发生的日志。请让我知道最好的方法是什么。如何使其线程安全。?

0 投票
5 回答
8142 浏览

linux - 公平临界区 (Linux)

在多线程 Linux 应用程序中,我将互斥锁用于关键部分。除了公平问题外,这非常有效。一个线程离开临界区并立即重新进入的情况可能不会给任何其他线程机会。例如

很可能会阻止任何其他线程进入相同的关键部分。互斥是不公平的。

有没有办法制作一个公平的关键部分?我正在考虑添加一个队列,以便关键部分按照它们的“到达”顺序执行。或者,如果其他线程正在等待,至少有一个计数器可以在解锁后执行 pthread_yield()。

对于这种要求,是否有推荐的做法?

0 投票
3 回答
3461 浏览

c++ - 互锁变量访问和临界区互锁增量之间的区别

有人可以帮助解释c ++中互锁变量访问和关键部分互锁增量之间的区别吗?谢谢,非常感谢,提前。

0 投票
6 回答
10215 浏览

c++ - .crt 部分?这个警告是什么意思?

我最近收到了这个警告(VC++ 2010)

warning LNK4210: .CRT section exists; there may be unhandled static initializers or terminators

我假设这是关键部分。自从我的操作系统课程以来已经有一段时间了,所以我无法真正弄清楚这意味着什么。如果我没记错的话,关键部分使用共享资源。那么这个警告是如何相关的,它到底是什么意思呢?