WindowsCE & Linux 应用开发

从来疾风有劲草,自古沃土少苍松.

导航

线程的同步化

线程的同步化,高级别的线程在使用同步化资源时,也需要等待。

1、互斥信号同步化对象

HANDLE HMutex =::CreateMutex(//生成互斥信号同步化对象
				//防止两个以上的线程同时访问一个共享资源
	NULL,	//缺省安全属性,使互斥句柄不可继承,CE不支持
	false, //指定互斥信号的初始状态“未被线程拥有”
	"forcount"//指定互斥信号名,可以在进程间共享互斥信号同步化对象
)		//保存互斥对象句柄

void SharedFunction()
{//使用共享资源count的操作互斥
...
WaitForSingleObject(//根据互斥信号同步化对象的状态决定是否阻塞线程
      HMutex,		//互斥信号同步化对象
	INFINITE);	//超时毫秒数,另一线程一直等待互斥信号变为FALSE
if (WaitForSingleObject(pDlg->m_hSynMutex,INFINITE) == WAIT_OBJECT_0)
{++count;
cout<<count<<'\n';
}
ReleaseMutex(HMutex);//释放互斥信号
}
CloseHandle(HMutex);//关闭互斥信号句柄,释放资源,在OnDestroy() 消息函数中被调用,不调用则程序退出系统自动关闭句柄

2、事件对象同步

	//创建线程同步事件句柄
HANDLE	m_hSynEvent = CreateEvent(NULL,false,true,NULL);//false表调完等待函数后自动设置事件对象成未标识
							//true表事件对象已标识
{//以下代码在线程函数中执行
	//等待同步事件信号
	if (WaitForSingleObject(m_hSynEvent,INFINITE) == WAIT_OBJECT_0){}//事件对象未标识
	//打开同步事件信号
	SetEvent(m_hSynEvent);//事件对象已标识
}
	//关闭线程同步事件对象, 释放资源,在OnDestroy() 消息函数中被调用
    	CloseHandle(m_hSynEvent);

3、临界区对象同步//只能同步同一进程中的线程

//线程同步临界区对象
CRITICAL_SECTION m_critical_Section;//用保存临界区对象	
//typedef struct CRITICAL_SECTION {
//    unsigned int LockCount;         /* Nesting count on critical section */
//    HANDLE OwnerThread;         	/* Handle of owner thread */
//    HANDLE hCrit;					/* Handle to this critical section */
//    DWORD needtrap;					/* Trap in when freeing critical section */
//    DWORD dwContentions;			/* Count of contentions */
//} CRITICAL_SECTION, *LPCRITICAL_SECTION;
	//初始化临界区对象
	InitializeCriticalSection(&m_critical_Section);
	//进入临界区
	EnterCriticalSection(&m_critical_Section);
	//离开临界区
	LeaveCriticalSection(&m_critical_Section);
	//释放临界区对象资源,在OnDestroy() 消息函数中被调用
	DeleteCriticalSection(&m_critical_Section);	

4、信号量同步//建立在互斥基础上,允许几个线程同时进入要同步的代码。控制资源被同时访问的线程数。

   	HANDLE m_hSynSemaphore;//信号量同步对象句柄
	//创建信号量对象,初始化信号量计数为1,最大信号量计数也为1(第二个1)
	m_hSynSemaphore = CreateSemaphore(NULL,1,1,NULL);
	
	//等待信号量可用,当信号量计数大于0时,可用
	if (WaitForSingleObject(pDlg->m_hSynSemaphore,INFINITE) == WAIT_OBJECT_0)
	//因为等待函数自动给信号量计数减1
	//所以给信号量计数加1,使信号量继续可用
	ReleaseSemaphore(pDlg->m_hSynSemaphore,1,NULL);
	//关闭信号量对象,释放资源,在OnDestroy() 消息函数中被调用
	CloseHandle(m_hSynSemaphore);

posted on 2008-02-19 19:42  zrs  阅读(325)  评论(0编辑  收藏  举报