VC++中多线程同步方法
// 2009-11-25 L4nk0r
PS:复习线程同步实现
当我们多个线程同时运行时就会出现同步问题。这里总结了3种线程同步:
1.利用互斥对象实现线程同步:
HANDLE CreateMutex(
// 安全特性
LPSECURITY_ATTRIBUTES lpMutexAttributes,
// 初始拥有者,TRUE:创建该互斥对象的线程或者 FALSE:该创建线程不获得所创建的互斥对象的所有权
BOOL bInitialOwner,
// 对象名字,为NULL表示匿名对象
LPCTSTR lpName
);
互斥对象属于内核对象,能够确保线程用于对单个资源的互斥访问权;
在主线程创建互斥对象:
HANDLE hMutex;
// 第一个线程,如果是TRUE,表示主线程获得该对象访问权,那么创建互斥对象后必须先利用
// ReleaseMutex来释放互斥对象,不然子线程永远不可能拿到执行权
hMutex=CreateMutex(NULL,FALSE,NULl);
在子线程中,采用函数等待:
// INFINITE表示无限制等待,直到该子线程获得执行,在要保护的代码前添加
WaitForSingleObject(hMutex,INFINITE)
当获得执行权是就有变成有信号状态
执行完成就要释放获得的访问权以给其他子线程访问:
// 记住一点:谁拥有互斥对象谁释放,否则其他线程不能在获得(通过互斥对象的线程ID来判断)
// 另外要注意互斥对象的计数器为0时才能释放访问权ReleaseMutex(hMutex);
这样就可以解决多个线程的访问问题。
总结以下几点:
a.谁拥有互斥对象谁释放
b.互斥对象的计数器为0时才能释放访问权
简单示例:程序实例运行唯一性实现
hMutex=CreateMutex(NULL,TRUE,"cplus");
if(hMutex)
{
if(ERROR_ALREADY_EXISTS==GetLastError())
{
AfxMessageBox("程序已经运行了!");
return FALSE;
}
}
WaitForSingleObject(hMutex,INFINITE);
ReleaseMutex(hMutex);
ReleaseMutex(hMutex);
AfxEnableControlContainer();
2.待续
补充:软件开发 , Vc ,