使用互斥对象实现线程同步

使用互斥对象实现线程同步
互斥对象属于系统内核对象,它能够使线程拥有对某个资源的绝对访问权。互斥对象主要包含使用

数量,线程ID和递归计数器等信息。其中线程ID表示当前拥有互斥对象的线程,递归计数器表示线程

拥有互斥对象的次数。
互斥对象的使用方式:当互斥对象的线程ID为0时,表示互斥对象不被任何线程拥有,此时系统会

发出该互斥对象的通知信号。等待互斥对象的某个线程将会拥有该互斥对象,同时互斥对象的线程ID

为拥有该互斥对象线程的ID。
当互斥对象的线程ID不是0时,表示当前有线程拥有该互斥对象。系统不会发

出互斥对象的通知信号。其他等待互斥对象的线程继续等待,直到拥有互斥对象的线程释放互斥对象

的拥有权
相关函数:
CreateMutex:创建互斥对象
HANDLE CreateMutex(LPSECURITY_ATTRBUTES,lpMutexAttributes,BOOL bInitialOwner,
LPCTSTR lpName)
lpMutexAttributes:表示互斥对象的安全属性,可以为NULL;
bInitialOwner:表示互斥对象的初始状态。如果是TRUE,互斥对象的线程ID为当前调用

线程的ID,互斥对象的递归计数器为1,当前创建互斥对象的哦线程拥

有互斥对象的拥有权。如果是FALSE,互斥对象的的ID是0,计数器为

0,系统会发出该互斥对象的通知信号
ReleaseMutes;释放互斥对象的拥有权
BOOL ReleaseMutex(HANDLE hMutex)
WaitForSingleObject:获得互斥对象,具体见事件对象一节中
DWORD WaitForSingleObject( HANDLE hHandle,DWORD dwMillseconds);

示例:
UINT output11(LPVOID pThreadParam)
{
CString text;
CAccessConflictDlg *pdlg=(CAccessConflictDlg *)pThreadParam;
while(pdlg->m_count<=100)
{
WaitForSingleObject(pdlg->m_mutex,INFINITE);//等待事件对象
text.Format("线程一输出%d",pdlg->m_count);
pdlg->m_count++;
pdlg->m_list.AddString(text);
Sleep(100);
ReleaseMutex(pdlg->m_mutex);
}
return 0;
}
UINT output22(LPVOID pThreadParam)
{
CString text;
CAccessConflictDlg *pdlg=(CAccessConflictDlg *)pThreadParam;
while(pdlg->m_count<=100)
{
WaitForSingleObject(pdlg->m_mutex,INFINITE);//等待事件对象
text.Format("线程二输出%d",pdlg->m_count);
pdlg->m_count++;
pdlg->m_list.AddString(text);
Sleep(100);
ReleaseMutex(pdlg->m_mutex);
}
return 0;
}
void CAccessConflictDlg::OnButton1()
{
m_mutex=CreateMutex(NULL,FALSE,"MUTEX");
output1=AfxBeginThread(output11,this,0,0,0,NULL);
output2=AfxBeginThread(output22,this,0,0,0,NULL);
CloseHandle(output1->m_hThread);
CloseHandle(output2->m_hThread);
// TODO: Add your control notification handler code here

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值