Sleep(0)和SwitchToThread之间的区别问题
两个都是放弃时间片,按照书中或者网上的一般说法,Sleep(0)将会在可调度的同等级或者高优先级的线程里面找,而SwitchToThread则是全系统范围,低优先级的也可能会被调用。
那么我为了测试spinlock而写了这么一段代码
volatile LONG g_x = FALSE;unsigned int _stdcall Thread_Low(void* pParam){ InterlockedExchange(&g_x,TRUE); return 0;}void main(){ HANDLE hThread = (HANDLE)_beginthreadex(NULL,NULL,Thread_Low,NULL,CREATE_SUSPENDED,NULL); _ASSERT(SetThreadPriority(hThread,THREAD_PRIORITY_IDLE)); SetThreadAffinityMask(hThread,0x00000001); _ASSERT(SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST)); SetThreadAffinityMask(GetCurrentThread(),0x00000001); ResumeThread(hThread); CloseHandle(hThread); LARGE_INTEGER liFreq = {0}; LARGE_INTEGER liStart = {0}; LARGE_INTEGER liEnd = {0}; QueryPerformanceFrequency(&liFreq); QueryPerformanceCounter(&liStart); while(InterlockedExchange(&g_x,FALSE) == FALSE) Sleep(0); QueryPerformanceCounter(&liEnd); cout<<(liEnd.QuadPart - liStart.QuadPart) / (double)liFreq.QuadPart<<'s'<<endl; return;}