代码之家  ›  专栏  ›  技术社区  ›  Steve Folly

我可以创建多少个关键部分?

  •  9
  • Steve Folly  · 技术社区  · 16 年前

    我可以初始化和使用的关键部分的数量有限制吗?

    我的应用程序创建了许多(几千个)需要线程安全的对象。如果我在每一个部分中都有一个关键部分,那会占用太多资源吗?

    我认为,因为我需要声明自己的关键部分对象,所以我不会像使用win32互斥体或事件那样浪费内核资源?但我只是有一个喋喋不休的疑问…?

    老实说,可能不是所有的物品 需要 对于我的应用程序来说是线程安全的,但是关键部分在库中的一些低级基类中,我确实需要几千个这样的类!

    我可能有机会修改这个库,所以我想知道是否有任何方法可以惰性地创建(然后从那时起使用)关键部分,只有当我检测到对象正从不同的线程使用到创建它的线程时?或者这就是窗户对我的作用?

    3 回复  |  直到 12 年前
        1
  •  7
  •   Matthew Xavier    16 年前

    如果您仔细阅读文档 IntializeCriticalSectionWithSpinCount() 显然,每个关键部分都由一个事件对象支持,尽管关键部分的API将其视为不透明结构。此外,dwspinCount参数上的“windows 2000”注释说明事件对象是“按需分配”。

    我不知道任何说明什么条件满足“按需”的文档,但我怀疑它是在进入关键部分时线程阻塞之前创建的。对于具有旋转计数的关键部分,可能要等到旋转等待结束。

    从经验上讲,我已经开发了一个应用程序,我知道它已经创建了至少60000个实时COM对象,每个对象都与它自己的关键部分同步。我从未见过任何错误表明我已经耗尽了内核对象的供应。

        2
  •  9
  •   Adam Rosenfield    16 年前

    没有限制 CRITICAL_SECTION 结构 您可以声明的——它们只是最低级别的pod数据结构。你可以限制一些数量 初始化 具有 InitializeCriticalSection() . 根据文件,它可能会引发 STATUS_NO_MEMORY 在Windows2000/XP/Server2003上是例外,但显然它保证在Vista上成功。在初始化它们之前,它们不会占用任何内核资源(如果它们占用了任何资源的话)。

    如果你发现 状态\无内存 正在引发异常,您只能尝试初始化 关键部分 对于一个给定的对象,如果有机会,它可以在多个线程中使用。如果您知道某个特定对象将只与一个线程一起使用,请设置一个标志,然后跳过对 初始化关键部分() , EnterCriticalSection() , LeaveCriticalSection() DeleteCriticalSection() .

        3
  •  0
  •   Marco van de Voort    16 年前

    afaik窗口上的大多数句柄/资源类型都受到内存或最大值的限制,不管是什么。(理论上,64位的maxint可能会发生)。

    您在这个主题上发现的有时很弱的文本通常只与Win9x相关,这有一些限制。(共64K个内核对象)