当前位置:编程学习 > VC++ >>

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 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,