您的位置:首页 > 其它

事件对象实现线程同步

2011-08-08 13:07 239 查看
线程同步,由于多个线程同时访问进程中的同一个资源,这就可能造成线程之间的混乱,因此需要线

程同步解决相关问题

1:使用事件对象实现线程同步

相关函数

CreateEvent:用于创建一个事件对象

HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,

BOOL bInitialState,LPCTSTR lpName);

lpEventAttributes:表示事件对象的安全属性

bManualReset:表示事件对象的类型,TRUE表示人工重置事件对象,FALSE表示自动重置事件

对象

bInitialState:表示事件对象的初始状态,TRUE为通知状态,FALSE表示未通知状态

lpName:表示事件对象的名称

SetEvent:用于将事件设置为通知状态

BOOL SetEvent(HANDLE hEvent)

ResetEvent:用于将事件设置为未通知状态

BOOL ResetEvent(HANDLE hEvent)



WaitForSingleObject:等待内核对象的状态

DWORD WaitForSingleObject(HANDLE hHandle,DWORD dwMillseconds);

dwMillseconds:表示等待的时间,单位为毫秒。如果等待的时间超过了该参数表示的时间

函数就会返回,如果参数设置为INFINITE,则函数一直等待,直到

Hhandle参数表示的对象处于通知状态

示例:

UINT output11(LPVOID pThreadParam)

{

CString text;

CAccessConflictDlg *pdlg=(CAccessConflictDlg *)pThreadParam;

while(pdlg->m_count<=100)

{

WaitForSingleObject(pdlg->m_event,INFINITE);//等待事件对象

text.Format("线程一输出%d",pdlg->m_count);

pdlg->m_count++;

pdlg->m_list.AddString(text);

Sleep(100);

SetEvent(pdlg->m_event);//设置事件为通知状态

}

return 0;

}

UINT output22(LPVOID pThreadParam)

{

CString text;

CAccessConflictDlg *pdlg=(CAccessConflictDlg *)pThreadParam;

while(pdlg->m_count<=100)

{

WaitForSingleObject(pdlg->m_event,INFINITE);//等待事件对象

text.Format("线程二输出%d",pdlg->m_count);

pdlg->m_count++;

pdlg->m_list.AddString(text);

Sleep(100);

SetEvent(pdlg->m_event);//设置事件为通知状态

}

return 0;

}

void CAccessConflictDlg::OnButton1()

{

m_event=CreateEvent(NULL,false,TRUE,"EVENT");//创建事件对象

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



}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: