我刚刚注意到英特尔文章中的以下短语:
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函数。
我是对的吗?