关于多线程分配时间片问题

ManderRong 2011-07-25 05:56:38
刚刚接触多线程,看了孙鑫的视频,跟着写了很小一段程序,发现了几个问题:
1.为什么程序运行结果显示:
Main Thread is running!
Main Thread is running!
Thread1 is running!
显示了两次Main Thread is running!呢
2.在不用sleep函数的情况下,为什么Thread1 is running!不显示呢,时间片是怎么分配的呀,我以为是创建了线程就分配了时间片那线程就可以运行!


#include<windows.h>
#include<iostream.h>

DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
);

void main()
{
HANDLE hThread1;
hThread1 = CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
cout<<"Main Thread is running!"<<endl;
Sleep(10);
}

DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
)
{
cout<<"Thread1 is running!"<<endl;
return 0;
}
...全文
307 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackyjkchen 2011-07-25
  • 打赏
  • 举报
回复
STL本身就不是线程安全,如果是VC6,甚至可能输出乱七八糟的东西
东莞某某某 2011-07-25
  • 打赏
  • 举报
回复
1:涉及到了MS的线程调度算法了,其算法是“公平的”,但有时候并不代表高优先级线程就总能得到时间片。这里主线程在执行后,子线程没有被调度。

2:如果不用sleep,主线程就刷的一下执行完了,子线程没有得以执行。sleep的作用就是使调用sleep(dwMilliseconds)的线程挂起,意思就是在dwMilliseconds时间范围内,该线程不能被调度了,当dwMilliseconds为0的时候,就表示该线程立刻放弃该时间片的剩余时间
野男孩 2011-07-25
  • 打赏
  • 举报
回复
控制台输出需要自己做同步处理,系统不会帮你完成。

而时间片分配,那也是针对待运行的线程。如果main退出了,那么可能就被视为进程要退出,县城资源自然就释放了,就不存在被调度,分配时间片一说。
至善者善之敌 2011-07-25
  • 打赏
  • 举报
回复
1.是由于主线程和ThreadProc1线程执行不协调导致flush了两遍,一次是main的endl,一次是ThreadProc1的endl

你应该做好同步工作,就不会有这个问题
2.不Sleep()的话可能你那个thread还没运行线程就结束了
BorrowedStory 2011-07-25
  • 打赏
  • 举报
回复
第一个还整不知怎么回事
第二个嘛是应为 不Sleep()的话可能你那个thread还没运行线程就结束了

64,664

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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