1:用Interlocked系列函数实现线程同步;
2:用CRITICAL_SECTION及其系列函数实现线程同步;
3:用RTL_SRWLOCK及其系列函数实现线程同步;
4:用事件内核对象实现线程同步;
5:用信号量内核对象实现线程同步;
1:用Interlocked系列函数实现线程同步实例如下:
//旋转锁
#include <iostream>
using namespace std;
#include <process.h>
#include <windows.h>
const int threadNum=10;
HANDLE hThread[threadNum];
volatile unsigned int ISOK=0;
unsigned int _stdcall Interlocked(PVOID threadId)
{
while(InterlockedExchange(&ISOK,1)==1) ;
cout<<"线程:"<<*(int*)threadId<<"开始"<<endl;
Sleep(100);
cout<<"线程:"<<*(int*)threadId<<"结束"<<endl;
InterlockedExchange(&ISOK,0);
return 0;
}
void InterlockedTest()
{
int threadId[threadNum];
for(int i=0;i<threadNum;i++)
{
threadId[i]=i+1;
}
cout<<"1:用Interlocked系列函数实现线程同步"<<endl;
for(int i=0;i<10;i++){
hThread[i]=(HANDLE)_beginthreadex(NULL, 0, Interlocked,threadId+i, 0, NULL);
}
WaitForMultipleObjects(threadNum, hThread, TRUE, INFINITE);
for(int i=0;i<threadNum;i++)
{
CloseHandle(hThread[i]);
}
}
InterlockedExchange确保以原子的方式操作数据。执行速度非常快,缺点是如果要同步的部分执行的时间比较长的话,while循环会一直轮询操作,浪费CPU的时间,在单核CPU的系统中,可能会出现while一直暂用CPU导致其他线程不能修改ISOK的值,导致不能跳出while循环,出现死循环。还有就是线程的优先级问题也能导致问题。
2:用CRITICAL_SECTION及其系列函数实现线程同步实例如下:
//关键段
#include <iostream>
using namespace std;
#include <process.h>
#include <windows.h>
const int threadNum=10;
HANDLE hThread[threadNum];