您的位置:首页 > 编程语言 > C语言/C++

windows via c/c++ 学习笔记(一)

2009-07-15 22:06 453 查看
以前从第一章看到第七章,没注意做笔记,如今拾起,已忘得差不多了,所以趁暑假时间充裕,决心做好笔记,以备同志们和我自己学习查阅.

因此,本学习笔记从第八章开始写起......

(一)用户模式下的线程同步

同步方法一:Interlocked系列函数

同步方法二:应避免的方法

volatileBOOLg_fFinishedCalculation=FALSE;

intWINAPI_tWinMain(...){
CreateThread(...,RecalcFunc,...);
...
//Waitfortherecalculationtocomplete.
while(!g_fFinishedCalculation)
;
...
}

DWORDWINAPIRecalcFunc(PVOIDpvParam){
//Performtherecalculation.
...g_fFinishedCalculation=TRUE;
return0;

}

注意BOOLg_fFinishedCalculation的值必须是:volatile,以防止编译器优化.

同步方法三:

constintCOUNT=10;

intg_nSum=0;

CRITICAL_SECTIONg_cs;


DWORDWINAPIFirstThread(PVOIDpvParam){

EnterCriticalSection(&g_cs);

g_nSum=0;

for(intn=1;n<=COUNT;n++){

g_nSum+=n;

}

LeaveCriticalSection(&g_cs);

return(g_nSum);

}



DWORDWINAPISecondThread(PVOIDpvParam){

EnterCriticalSection(&g_cs);

g_nSum=0;

for(intn=1;n<=COUNT;n++){

g_nSum+=n;

}

LeaveCriticalSection(&g_cs);

return(g_nSum);

}

1.速度快,但是无法再多个进程之间对线程进行同步.
2.注意还有一个函数TryEnterCriticalSection()
3.Touseaspinlockwithacriticalsection,
youshouldinitializethecriticalsectionbycallingthisfunction:
BOOLInitializeCriticalSectionAndSpinCount(
PCRITICAL_SECTIONpcs,
DWORDdwSpinCount);

同步方法四:Slim读写锁
写:
VOIDAcquireSRWLockExclusive(PSRWLOCKSRWLock);
VOIDReleaseSRWLockExclusive(PSRWLOCKSRWLock);
读:
VOIDAcquireSRWLockShared(PSRWLOCKSRWLock);
VOIDReleaseSRWLockShared(PSRWLOCKSRWLock);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: