sleep

asdface 2009-11-17 07:45:35
这个是一个有关于多线程临界区的问题
#include <windows.h>
#include <iostream.h>


DWORD WINAPI ThreadProc1(
LPVOID lpParameter);
DWORD WINAPI ThreadProc2(
LPVOID lpParameter);

CRITICAL_SECTION g_S;
HANDLE h_Thread[2];

int num=10;
void main()
{

InitializeCriticalSection(&g_S);
h_Thread[0]=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);
h_Thread[1]=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);

WaitForMultipleObjects(2,h_Thread,TRUE,INFINITE);

DeleteCriticalSection(&g_S);
CloseHandle(h_Thread[0]);
CloseHandle(h_Thread[1]);
return ;
}



DWORD WINAPI ThreadProc1(
LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_S);
if(num<=0)
{

LeaveCriticalSection(&g_S);
return 0;
}

cout<<"Thread 1: "<<num<<endl;
num--;
Sleep(1000); //此处的sleep的作用?
LeaveCriticalSection(&g_S);

}

return 0;
}


DWORD WINAPI ThreadProc2(
LPVOID lpParameter)
{
while(TRUE)
{
EnterCriticalSection(&g_S);
if(num<=0)
{
LeaveCriticalSection(&g_S);
return 0;
}

cout<<"Thread 2: "<<num<<endl;
num--;
Sleep(1000);
LeaveCriticalSection(&g_S);

}

return 0;
}

如果把那两个sleep去掉的话程序运行结果会变成:
thread1:10
thread1:9
thread1:8
.
.
.
正常情况会是:
thread1:10
thread2:9
thread1:8
.
.
.
why this happened?
难道sleep了线程就算收到WaitForMultipleObjects(2,h_Thread,TRUE,INFINITE);也不会执行,而会让其他的线程执行?
现在穷的,就不上分了
...全文
54 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
dollfacedboyfriend 2009-11-17
  • 打赏
  • 举报
回复
所谓临界区,是用来放置会被多个线程访问的资源,当一个线程在访问临界区资源时,别的线程会一直等待,直到这个线程释放临界区资源,就像这个例子里,有两个线程会去修改同一个全局变量!而sleep的作用在于让当前的线程放弃剩余的cpu时间片!那么结果自然是这样的!
亚细亚 2009-11-17
  • 打赏
  • 举报
回复
前两天也看到临界区这个概念,不是很懂,估计随时时间的推移,慢慢会理解的。
帮你顶一下!

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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