线程同步的方法总结

http://bbs.csdn.net/topics/465824

1.所有的线程同步中,基于互斥的临界区同步时最好的选择。
2.信号量的作用不是用于同步,而是用于确保同一块数据资源,在某个时间段内可以被设定个数的几个线程同时访问;特别地,当设定数目为1时,即变为了同步。


事件同步:
m_hEvent = CreateEvent(
NULL,
FALSE, // 不是手动设定事件的标志状态,如果是 TRUE,手动设定则必须在 WaitForSingleObject 后,手动 ResetEvent
TRUE, // 设定事件被标注,这样才可以执行
NULL); // 名称,如果名称与之前已经创建且未被销毁的事件同名,则无效;当数值与已创建的信号量、互斥量、等待时间、工作、内存文件映射名称相同时,函数将会执行失败。


// 因为线程普遍被声明为 static 类型,因此不能访问类成员
DWORD WINAPI ThreadProc(LPVOID lpDump)
{
// 初始化,假设 Obj 是类的一个实例对象...
if (WaitForSingleObject(Obj.m_hEvent, INFINITE) == WAIT_OBJECT_0)
{
// 如果 CreateEvent 手动设定事件标注状态,那么请添加本句代码:ResetEvent(Obj.m_hEvent);
// 执行,这里处理多个线程都要访问的数据
}
// 恢复事件的标注状态
SetEvent(m_hEvent);
return EXIT_SUCCESS;
}


// 因为 CreateEvent,记得要在退出时释放内存,防止泄露:
CloseHandle(m_hEvent);


互斥:
m_hMutex = CreateMutex(
NULL,
FALSE, // 不被线程拥有,未上锁
NULL); // 名称同上


// 同上,除了不存在要 ResetEvent 外,SetEvent 改为 ReleaseMutex,退出时也是 CloseHandle(m_hMutex);


信号量:
m_hSemaphore = CreateSemaphore(NULL, 1, 1, NULL); // 初始化信号量计数和最大计数为 1
// 同上,因为 Wait* 函数会自动使信号量计数减一,因此 ReleaseMutex 改为加一 ReleaseSemaphore(Obj.m_hSemaphore, 1, NULL);
// 退出时也是:CloseHandle


临界区:
CRITICAL_SECTION m_section;
// 在 OnInitialDialog 中的添加额外代码处补上:InitialCriticalSection(&m_section);
// 在进入线程中处理多个线程都要访问的数据前补上(无需使用复合语句包含那一部分,也无需使用WaitForSingleObject):EnterCriticalSection(&m_section);
// 在处理完成后补上:LeaveCriticalSection(&m_section);
// 在释放资源时:DeleteCriticalSection(&m_section);

你可能感兴趣的:(线程同步)