Ste*_*lly 9 c++ winapi multithreading windows-xp thread-safety
我可以初始化和使用的关键部分的数量是否有限制?
我的应用程序创建了许多(几千个)需要线程安全的对象.如果我在每个中都有一个关键部分,那会耗尽太多资源吗?
我认为,因为我需要声明自己的CRITICAL_SECTION对象,我不会像使用Win32 Mutex或Event那样浪费内核资源吗?但我只是有一个唠叨的怀疑......?
说实话,并非所有这些对象都可能需要对我的应用程序是线程安全的,但关键部分是在库中的某些低级基类中,我确实需要几千个它们!
我可能有机会修改这个库,所以我想知道是否有任何方法懒惰地创建(然后使用从那时开始)临界区只有当我检测到对象是从一个不同的线程使用到它的那个创建于?或者这是Windows会为我做什么?
您可以声明的CRITICAL_SECTION 结构数量没有限制- 它们只是最低级别的POD数据结构.可能有一些限制,你可以数初始化用InitializeCriticalSection().根据文档,它可能会STATUS_NO_MEMORY在Windows 2000/XP/Server 2003上引发异常,但显然它可以保证在Vista上取得成功.在初始化它们之前,它们不会占用任何内核资源(如果它们完全采用它们).
如果您发现STATUS_NO_MEMORY异常被引发,则可以尝试仅为CRITICAL_SECTION给定对象初始化它,如果它有可能在多个线程中使用的话.如果你知道某个特定对象将只用于一个线程,设置一个标志,然后跳过所有呼叫InitializeCriticalSection(),EnterCriticalSection(),LeaveCriticalSection(),和DeleteCriticalSection().
如果仔细阅读IntializeCriticalSectionWithSpinCount()的文档,很明显每个关键部分都由Event对象支持,尽管关键部分的API将它们视为不透明结构.此外,dwSpinCount参数的"Windows 2000"注释指出事件对象是"按需分配".
我不知道有什么文件说明了什么条件满足'按需',但是我怀疑它不会在进入临界区时线程阻塞之前创建.对于具有旋转计数的关键部分,可能直到旋转等待耗尽.
从经验上讲,我已经开发了一个应用程序,我知道它创建了至少60,000个实时COM对象,每个对象都与自己的CRITICAL_SECTION同步.我从未见过任何错误,表明我已经耗尽了内核对象的供应.
| 归档时间: |
|
| 查看次数: |
3235 次 |
| 最近记录: |