WaitForSingleObject和max。等待线程

时间:2015-11-10 20:10:33

标签: c++ windows multithreading winapi

我刚刚注意到英特尔文章中的以下短语:

  

WaitForSingleObject的一个缺点是它总是会获得   一个内核锁,所以它进入特权模式(ring 0)是否锁定   是否实现。即使a,此API也会进入Windows内核   指定0超时。 这种锁定方法的另一个缺点   是它只能处理64个试图锁定的线程   立刻反对

如果我理解正确,这段代码中有一个UB:

#include <Windows.h>

#include <cstdlib>
#include <iostream>
#include <vector>

#define THREAD_COUNT 100

HANDLE g_mutex;

DWORD WINAPI foo(LPVOID lpParameter)
{
  WaitForSingleObject(g_mutex, INFINITE);
  return 0;
}

int main()
{
  g_mutex = CreateMutex(
    NULL,              // default security attributes
    FALSE,             // initially not owned
    NULL);             // unnamed mutex
  if (g_mutex == NULL)
  {
    return EXIT_FAILURE;
  }

  WaitForSingleObject(g_mutex, INFINITE);

  std::vector<HANDLE> threads;
  for (int i = 0; i < THREAD_COUNT; i++)
  {
    HANDLE th = CreateThread(
      NULL,       // default security attributes
      0,          // default stack size
      (LPTHREAD_START_ROUTINE)foo,
      NULL,       // no thread function arguments
      0,          // default creation flags
      NULL);      // don't receive thread identifier
    if (th == NULL)
    {
      return EXIT_FAILURE;
    }

    threads.push_back(th);
  }

  while (true)
  {
    Sleep(100);
  }
}

因为它强制超过64个线程等待特定资源(在我的例子中,是互斥)。

我知道WaitForMultipleObjects函数存在此限制,但在文章中说明了WaitForSingleObject函数。

我是对的吗?

0 个答案:

没有答案