标签:
(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