问一个线程同步的问题

[复制链接]
查看11 | 回复4 | 2021-1-27 07:04:27 | 显示全部楼层 |阅读模式
我想写一个多线程产生MD5的程序但是在线程同步那有点问题
由于刚接触线程根本部知道程序错在哪请大家帮帮忙看下
UINTthread1(LPVOIDlParam)
{
CPlaythreadDlg*dlg=(CPlaythreadDlg*)AfxGetApp()->GetMainWnd();//获得指针
CStringth,sp,temp,getmd;
sp="\r\n\n";
while(TRUE)//循环产生值
{
WaitForSingleObject(dlg->g_hEvent,INFINITE);//等信号
if(dlg->jj);//将J的值转换成CSTRING型
dlg->Md5fun(th,getmd);
getmd="线程1产生"+th+"的MD5值为"+getmd+sp;
dlg->GetDlgItemText(IDC_EDIT1,temp);
getmd+=temp;
dlg->SetDlgItemText(IDC_EDIT1,getmd);//输出
th="";
dlg->j++;//J++
}
else
break;
SetEvent(dlg->g_hEvent);//设置信号量
}
return0;
}
UINTthread2(LPVOIDlParam)
{
CPlaythreadDlg*dlg=(CPlaythreadDlg*)AfxGetApp()->GetMainWnd();
CStringth,sp,temp,getmd;
sp="\r\n\n";
Section.Lock();
while(TRUE)
{
WaitForSingleObject(dlg->g_hEvent,INFINITE);
if(dlg->jj);
dlg->Md5fun(th,getmd);
getmd="线程2产生"+th+"的MD5值为"+getmd+sp;
dlg->GetDlgItemText(IDC_EDIT1,temp);
getmd+=temp;
dlg->SetDlgItemText(IDC_EDIT1,getmd);
th="";
dlg->j++;
}
else
break;
SetEvent(dlg->g_hEvent);
}
return0;
}
UINTthread3(LPVOIDlParam)
{
CPlaythreadDlg*dlg=(CPlaythreadDlg*)AfxGetApp()->GetMainWnd();
CStringth,sp,temp,getmd;
sp="\r\n\n";
while(TRUE)
{
WaitForSingleObject(dlg->g_hEvent,INFINITE);
//ResetEvent(g_hEvent);
if(dlg->jj);
dlg->Md5fun(th,getmd);
getmd="线程3产生"+th+"的MD5值为"+getmd+sp;
dlg->GetDlgItemText(IDC_EDIT1,temp);
getmd+=temp;
dlg->SetDlgItemText(IDC_EDIT1,getmd);
th="";
dlg->j++;
}
else
break;
SetEvent(dlg->g_hEvent);
}
return0;
}
都是一样的了就不写注释了为什么就不能一直同步啊?当sleep的时候也不能同步
我看孙心老师的教程上就可以为什么我的不行代码我是仿照他上面写的
AfxBeginThread(thread1,NULL);
AfxBeginThread(thread2,NULL);
AfxBeginThread(thread3,NULL);
为什么不行啊?请大家指点下谢谢了
分 -->
回复

使用道具 举报

千问 | 2021-1-27 07:04:27 | 显示全部楼层
所有的线程都会停在WaitForSingleObject(dlg->g_hEvent,INFINITE);因为没有线程触发第一个Event,这里建议用Mutex
回复

使用道具 举报

千问 | 2021-1-27 07:04:27 | 显示全部楼层
楼上的能给个例子么?我上网找了好多都不够清晰
或者指点下
回复

使用道具 举报

千问 | 2021-1-27 07:04:27 | 显示全部楼层
你在
AfxBeginThread(thread1,NULL);
AfxBeginThread(thread2,NULL);
AfxBeginThread(thread3,NULL);
之后某处要进行
SetEvent(dlg->g_hEvent);

回复

使用道具 举报

千问 | 2021-1-27 07:04:27 | 显示全部楼层
做了但是还是不行
g_hEvent=CreateEvent(NULL,FALSE,FALSE,"tickets");
SetEvent(g_hEvent);
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行