Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以创建多少关键部分?_C++_Multithreading_Winapi_Windows Xp_Thread Safety - Fatal编程技术网

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

C++ 我可以创建多少关键部分?,c++,multithreading,winapi,windows-xp,thread-safety,C++,Multithreading,Winapi,Windows Xp,Thread Safety,我可以初始化和使用的关键部分的数量是否有限制 我的应用程序创建了大量(数千个)需要线程安全的对象。如果我在每个部分中都有一个关键部分,这会占用太多资源吗 我认为,因为我需要声明自己的CRITICAL_SECTION对象,所以我不会像使用Win32互斥或事件那样浪费内核资源?但我只是有一个烦人的疑问 老实说,对于我的应用程序,并非所有这些对象都需要线程安全,但关键部分在库中的某个低级基类中,我确实需要几千个 我可能有机会修改这个库,所以我想知道只有当我检测到对象从不同的线程被使用到创建它的线程时,

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

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

我认为,因为我需要声明自己的CRITICAL_SECTION对象,所以我不会像使用Win32互斥或事件那样浪费内核资源?但我只是有一个烦人的疑问

老实说,对于我的应用程序,并非所有这些对象都需要线程安全,但关键部分在库中的某个低级基类中,我确实需要几千个


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

您可以声明的
关键部分
结构的数量没有限制--它们只是最低级别的POD数据结构。您可以初始化的数量可能有一些限制。根据文档,它可能会在Windows 2000/XP/Server 2003上引发一个
STATUS\u NO\u MEMORY
异常,但显然它肯定会在Vista上成功。在您初始化它们之前,它们不会占用任何内核资源(如果它们占用任何资源的话)


如果您发现引发了
状态\u无内存
异常,您只能尝试初始化给定对象的
关键\u部分
,如果该部分有可能在多线程中使用。如果您知道某个特定对象将只与一个线程一起使用,请设置一个标志,然后跳过对
InitializeCriticalSection()
EnterCriticalSection()
LeaveCriticalSection()
、和
DeleteCriticalSection()
的所有调用,前提是您仔细阅读以下文档:,很明显,每个关键部分都有一个事件对象支持,尽管关键部分的API将它们视为不透明结构。此外,dwSpinCount参数上的“Windows 2000”注释说明事件对象是“按需分配的”

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


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

Afaik Windows上的大多数句柄/资源类型都受到内存或maxint的限制,不管是什么先出现。(理论上,我猜64位maxint可能会发生)


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

谢谢Adam。我想把你的答案也设置为可接受的答案,但我一次只能设置一个,马修的60000个COM对象的经验证据给了我温暖模糊的感觉@SteveFolly我听到有人在实践中使用60000个关键部分时也有同样的反应。