MFC线程同步_CreateSemaphore信号量

UINT __cdecl ThreadProc4( LPVOID pParam ){//UINT = 无符号的int类型,4个字节,看平台决定
C界面线程Dlg* t = (C界面线程Dlg*)pParam;//强制类型转换
while(true){
CString str;
DWORD ret = WaitForSingleObject(semaphoreh,0);//获取信号量,超时为0 ,表示不等待, 如果调用成功的话,信号量会减1
if(ret == WAIT_ABANDONED || ret == WAIT_OBJECT_0){//WAIT_ABANDONED为异常,WAIT_OBJECT_0为正常等待成功,信号量会减1
str.Format("已等到...%d\r\n",GetCurrentThreadId());//说明已经成功等到
t->myedit1+=str;
::SendMessage(t->GetSafeHwnd(), WM_MyMessage, 0,0);//发送了,如果 想在不是主线程的线程中操作窗口的话,就用发送消息
Sleep(5000);
ReleaseSemaphore(semaphoreh,1,NULL);//用完后要把信号量加1,最后一个参数为加1前的有多少个信号量
}else{//WAIT_TIMEOUT
//说明未等到
Sleep(1000);
str.Format("未等到...%d\r\n",GetCurrentThreadId());
t->myedit1+=str;
::SendMessage(t->GetSafeHwnd(), WM_MyMessage, 0,0);//发送了,如果 想在不是主线程的线程中操作窗口的话,就用发送消息
}
}
return 0;
}
void C界面线程Dlg::OnBnClickedButton10()
{
//HANDLE WINAPI CreateSemaphore(
// __in LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,//安全级别
// __in LONG lInitialCount,//刚开始可以取多少个信号
// __in LONG lMaximumCount,//一共有多少个信号
// __in LPCTSTR lpName//名字
//);
semaphoreh = CreateSemaphore(NULL,2,2,NULL);//因为只在我们这个线程使用,所以就不需要名字,
this->myedit1="";
ccc = 0;
for(int i=0;i<4;i++){
AfxBeginThread(ThreadProc4,this);
}
}
通过CreateSemaphore 创建信号量来控制线程的访问数
量
因为他是内核对象,所以必要挂
已等到...6536
已等到...8496
未等到...12652
未等到...12628
未等到...12652
未等到...12628
未等到...12652
未等到...12628
未等到...12652
未等到...12628
未等到...12652
未等到...12628
已等到...6536
已等到...8496
未等到...12652
未等到...12628
未等到...12652
我们可以看到,5秒内访问的线程数只能有2个...

浙公网安备 33010602011771号