线程同步,sleep函数!!

猪的飞想 2007-07-19 12:03:40
UINT CDIY_MFC_MultithreadingDlg::ThreadNo1(LPVOID pParam)
{
srand( (unsigned)time( NULL ) );
PParam* pp=(PParam*)pParam;//必须这样过度!
CSingleLock singleLock(&(pp->m_Section));//Section也不例外!!!!!!
for (int i=0;;i++)
{

if (pp->m_Terminate==FALSE)
{
singleLock.Lock();

pp->m_Result=rand();
if (1600<pp->m_Result&&pp->m_Result<1700)
{

pp->m_Terminate=TRUE;
//pp->m_ThreadID="线程胜利!"
pp->m_ResultR=pp->m_Result;
pp->ThreadID=1;
pp->m_Count=i;

break;
}
else
{ Sleep(1);
singleLock.Unlock();
}
}
else
{
break;
}

}
return 0;
}


UINT CDIY_MFC_MultithreadingDlg::ThreadNo2(LPVOID pParam)
{
srand( (unsigned)time( NULL ) );
PParam* pp=(PParam*)pParam;//必须这样过度!
CSingleLock singleLock(&(pp->m_Section));//Section也不例外!!!!!!
for (int i=0;;i++)
{

if (pp->m_Terminate==FALSE)
{
singleLock.Lock();

pp->m_Result=rand();
if (1800<pp->m_Result&&pp->m_Result<1900)
{

pp->m_Terminate=TRUE;
//pp->m_ThreadID="线程胜利!"
pp->m_ResultR=pp->m_Result;//过度
pp->ThreadID=2;
pp->m_Count=i;

break;
}
else
{ Sleep(1);
singleLock.Unlock();
}
}
else
{
break;
}

}
return 0;
}

请问为什么必须加Sleep()函数呢?不为为什么不可以啊?我必须这样过度:“pp->m_ResultR=pp->m_Result;//过度”否则出现不了我理想的结果,说明有结果了其他线程没有马上终止!为什么啊?
...全文
257 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
woodcheaper 2007-07-19
  • 打赏
  • 举报
回复
“pp->m_ResultR=pp->m_Result;//过度”,是因为当线程1得到符合要求的随机数并且退出时,线程2可能刚好处于singleLock.Lock()语句处,于是它要继续向下执行并且改变pp->m_Result的值,直到下一个循环才检测到pp->m_Terminate==TRUE,这时才退出。

wangk 2007-07-19
  • 打赏
  • 举报
回复
那是因为要用Sleep(1)让CPU切换线程,否则CPU并不知道到这里后可能有资源竞争。
猪的飞想 2007-07-19
  • 打赏
  • 举报
回复
就是让三个线程进行“竞赛”看哪个产生的随机数最先符合要求!但不加几乎永远是线程1“获胜”!
还有,我必须这样过度:“pp->m_ResultR=pp->m_Result;//过度”否则出现不了我理想的结果,说明有结果了其他线程没有马上终止!为什么啊?
猪的飞想 2007-07-19
  • 打赏
  • 举报
回复
可以实现了!
但是我还想问:一个时间片,一般可以执行多少条语句啊?
DentistryDoctor 2007-07-19
  • 打赏
  • 举报
回复
从柜架上看是不需要sleep的,至于你说的理想是什么?还有其它的上下文?
龙凤呈祥焱 2007-07-19
  • 打赏
  • 举报
回复
不知楼主如何决定这个最先??
按产生的顺序??
还是按产生的时间???
单CPU,多线程其实并不是真正的同时运行的。操作系统的线程切换,让你根本没法决定你的线程是否会被执行。那又怎么判断最先呢???
你在Lock之前判断m_Terminate的值怎么行呢?
就是楼上说的
“pp->m_ResultR=pp->m_Result;//过度”,是因为当线程1得到符合要求的随机数并且退出时,线程2可能刚好处于singleLock.Lock()语句处。
只是这可不是刚好,Lock阻塞了线程执行,如果线程执行了Lock后被系统挂起,线程2开始执行,到了Lock这里,线程2也会被挂起。要等到下一个时间片,才能决定线程2 能否运行。那线程2在Lock这里挂起的几率比买彩票中大奖的几率高多了。只要线程1没有Unlock,线程2永远执行不了。

你的想法应该是让两个线程交替运行吧。也就是线程1先执行一个循环,然后是线程2。然后又是线程1-》线程2.....
但如果只是你现在这么简单的同步,是无法实现的。
猪的飞想 2007-07-19
  • 打赏
  • 举报
回复
那么应该如何进行修改?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧