我只注意到英特尔文章中的一句话:
WaitForSingleObject的一个缺点是它总是会获得一个内核锁,因此它是否进入特权模式(ring 0)。 即使指定了0超时,该API也会进入Windows内核。 这种locking方法的另一个缺点是它只能处理64个线程,试图一次locking一个对象
如果我正确地理解它,这个代码有一个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函数。
我对吗?