标签:
(3)不要长时间占用锁,其他线程可能进入等待状态,影响程序性能
以下是测试代码:
<span style="white-space:pre"> </span>//获取CPU核心数以及每个CPU的高速缓存行的大小
<span style="white-space:pre"> </span>PSYSTEM_LOGICAL_PROCESSOR_INFORMATION buffer = NULL; DWORD dwLen = 0; while( true ) { if ( GetLogicalProcessorInformation(buffer, &dwLen) ) break; if ( GetLastError() != ERROR_INSUFFICIENT_BUFFER ) { cout<<"Error code = "<<GetLastError()<<endl; return 1; } if ( buffer ) free(buffer); buffer = (PSYSTEM_LOGICAL_PROCESSOR_INFORMATION)malloc(dwLen); if ( NULL == buffer ) { cout<<"Error to malloc"<<endl; return 2; } } int nProcCoreCount = 0; int nByteOffset = 0; PSYSTEM_LOGICAL_PROCESSOR_INFORMATION ptr = buffer; while( nByteOffset<dwLen ) { switch( ptr->Relationship ) { case RelationProcessorCore: nProcCoreCount++; break; case RelationCache: cout<<"cpu"<<nProcCoreCount<<"'s cache size is "<<ptr->Cache.LineSize<<"byte"<<endl; break; default: break; } nByteOffset += sizeof(SYSTEM_LOGICAL_PROCESSOR_INFORMATION); ptr++; } cout<<"ProcessorCore count is "<<nProcCoreCount<<endl; free(buffer);
/*////////////////////////////////////////// //旋转锁 CPU不断比较两个值,会消耗CPU时间。这里假定所有线程都以相同的优先级运行,对于需要用旋转锁的线程,可能需要使用 SetProcessPriorityBoost或者SetThreadPriorityBoost函数来禁止线程优先级提升。 在只有单处理器上的机器不应该使用旋转锁,否则容易造成死锁。 */ DWORD WINAPI Thread1(LPVOID lpParam) { while( InterlockedExchange(&g_bUse, TRUE) == TRUE ) {//返回TRUE表示正在被使用,继续等待 Sleep(0); } //返回FALSE,表示当前没有被使用,我们已经将其设置为正在被使用 //do something g_nIndex++; Sleep(300); //使用完了后,设置状态为未使用 InterlockedExchange(&g_bUse, FALSE); return 0; }
Windows核心编程笔记(6)----用户模式下的线程同步
标签:
原文地址:http://blog.csdn.net/mfcing/article/details/43271421