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

时间:2022-03-01 00:51:09
刚刚接触多线程,看了孙鑫的视频,跟着写了很小一段程序,发现了几个问题:
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;
}

6 个解决方案

#1


该回复于2011-07-26 10:08:14被版主删除

#2


第一个还整不知怎么回事
第二个嘛是应为 不Sleep()的话可能你那个thread还没运行线程就结束了

#3


1.是由于主线程和ThreadProc1线程执行不协调导致flush了两遍,一次是main的endl,一次是ThreadProc1的endl

你应该做好同步工作,就不会有这个问题
2.不Sleep()的话可能你那个thread还没运行线程就结束了

#4


控制台输出需要自己做同步处理,系统不会帮你完成。

而时间片分配,那也是针对待运行的线程。如果main退出了,那么可能就被视为进程要退出,县城资源自然就释放了,就不存在被调度,分配时间片一说。

#5


1:涉及到了MS的线程调度算法了,其算法是“公平的”,但有时候并不代表高优先级线程就总能得到时间片。这里主线程在执行后,子线程没有被调度。

2:如果不用sleep,主线程就刷的一下执行完了,子线程没有得以执行。sleep的作用就是使调用sleep(dwMilliseconds)的线程挂起,意思就是在dwMilliseconds时间范围内,该线程不能被调度了,当dwMilliseconds为0的时候,就表示该线程立刻放弃该时间片的剩余时间

#6


STL本身就不是线程安全,如果是VC6,甚至可能输出乱七八糟的东西

#1


该回复于2011-07-26 10:08:14被版主删除

#2


第一个还整不知怎么回事
第二个嘛是应为 不Sleep()的话可能你那个thread还没运行线程就结束了

#3


1.是由于主线程和ThreadProc1线程执行不协调导致flush了两遍,一次是main的endl,一次是ThreadProc1的endl

你应该做好同步工作,就不会有这个问题
2.不Sleep()的话可能你那个thread还没运行线程就结束了

#4


控制台输出需要自己做同步处理,系统不会帮你完成。

而时间片分配,那也是针对待运行的线程。如果main退出了,那么可能就被视为进程要退出,县城资源自然就释放了,就不存在被调度,分配时间片一说。

#5


1:涉及到了MS的线程调度算法了,其算法是“公平的”,但有时候并不代表高优先级线程就总能得到时间片。这里主线程在执行后,子线程没有被调度。

2:如果不用sleep,主线程就刷的一下执行完了,子线程没有得以执行。sleep的作用就是使调用sleep(dwMilliseconds)的线程挂起,意思就是在dwMilliseconds时间范围内,该线程不能被调度了,当dwMilliseconds为0的时候,就表示该线程立刻放弃该时间片的剩余时间

#6


STL本身就不是线程安全,如果是VC6,甚至可能输出乱七八糟的东西