多线程测试中,main中的sleep函数执行了多遍,而子线程却只执行一遍,这是为何

多线程测试中,main中的sleep函数执行了多遍,而子线程却只执行一遍,这是为什么?
代码如下:

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

DWORD WINAPI Fun1Proc(  LPVOID lpParameter );

int main(int argc, char* argv[])
{
    HANDLE hThread1;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
CloseHandle(hThread1);
cout<<"main thread is running"<<endl;
    Sleep(1000);
Sleep(1000);
Sleep(1000);
Sleep(1000);
Sleep(1000);
return 0;
}

DWORD WINAPI Fun1Proc(  LPVOID lpParameter  )
{
  cout<<"thread1  is running!  "<<endl;
  return 0;
}

执行后的结果为:
main thread is running
thread1  is running!
Press any key to continue

问题如下:
(1)为什么main中sleep()函数执行了多次,而“thread1  is running!”却出现了一次?
(2)为什么当用sleep(10)且只执行一次时,执行后输出结果同上,而用sleep(1000)且只执行一次时,输出结果也是同上,1000ms的时间可是10ms时间的100倍呀,Fun1Proc函数在sleep(1000)的时间里应该能多执行几次吧,应该能多输出几行“thread1  is running!”吧,为什么也只输出一次。
------解决思路----------------------
把子线程的优先度提高点看看.

------解决思路----------------------
DWORD WINAPI Fun1Proc(  LPVOID lpParameter  )
{
  cout<<"thread1  is running!  "<<endl;
  return 0;
}
你只创建了一个线程,而这个线程中只调用了一次cout,所以只输出了一次内容。
如果需要输出多次内容,需要多次调用cout
DWORD WINAPI Fun1Proc(  LPVOID lpParameter  )
{
while(true)
{
  cout<<"thread1  is running!  "<<endl;
}
  return 0;
}
------解决思路----------------------
你只创建了一个线得程,线程里也只有一个cout,怎么能期望有多次输出呢,不知楼主受什么说法的误导了
------解决思路----------------------
同意4楼的,你的线程在输出一次以后,生命期已经结束,线程已经退出了,所以不会再次输出了!
------解决思路----------------------
引用:
Quote: 引用:

DWORD WINAPI Fun1Proc(  LPVOID lpParameter  )
{
  cout<<"thread1  is running!  "<<endl;
  return 0;
}
你只创建了一个线程,而这个线程中只调用了一次cout,所以只输出了一次内容。
如果需要输出多次内容,需要多次调用cout
DWORD WINAPI Fun1Proc(  LPVOID lpParameter  )
{
while(true)
{
  cout<<"thread1  is running!  "<<endl;
}
  return 0;
}


谢谢,但是我的意思是,空闲时间10ms,子线程就可被调用一次,空闲时间为1000ms时,子线程在此期间应多次被调用,多次输出  thread1  is running!   这个提示呀,为什么1000ms时也只输出了一次,您明白我的问题了吗?


你在主线程中开了一个线程出来,这个线程跟主线程逻辑上就没有任何关系了,两个线程之间是异步执行的(因为你没有进行同步控制,即使你进行了同步控制,那也是逻辑上的关系,而不是功能上的关系),至于CPU的占用时间,是由系统进行调度的

也就是说要看你的线程执行的功能过程,你的线程函数就 cout<<"thread1  is running!  "<<endl;,只输出一句,然后线程函数就执行完了,也就说线程执行完了(不代表线程HANDLE被销毁了!),怎么让它输出多句呢??
------解决思路----------------------
1,线程函数, 不能 退出, 一旦 退出 , 这个 线程 就 不存在了。
2,线程函数里 , 不能 有 独占 cpu 的 语句 (如 while(1))

DWORD WINAPI Fun1Proc(  LPVOID lpParameter  )
{
     while(true)
    {
          cout<<"thread1  is running!  "<<endl;
         Sleep(100);// 让 别的 程序 工作
    }
    return 0;
}
------解决思路----------------------
楼主对线程一节需要多加理解.

线程是执行一个函数, 只要这个函数执行完成了, 那么线程也就自然结束了.

以你的程序来说,
main函数是主线程, 因为在不停的sleep, 所以还未结束.
而子线程中只有一句cout<<"thread1  is running!  "<<endl;, 当这句执行完成后, 子线程就已经结束了.
所以就有你程序中的输出.
------解决思路----------------------
这个线程执行完了,OS在这SLEEP(1000)的时间段内还可以多次给它分配时间片呀,它每分配到一个时间版,不都可以执行一次cout<<"thread1  is running!  "<<endl;吗?不就应该在这SLEEP(1000)的时间内多次输出thread1  is running! 吗,这是我的问题,谢谢!
------------------------------------------------------------------------------------------------------------------------------------------
你咋还犯迷糊呢?!hThread1在分配到时间段之后,其线程执行函数走完该线程就退出了,之后即使CPU有大把的空闲时间,怎么可能把时间片分配给一个已经不存在的线程呢?? 

即使你的线程函数Fun1Proc不是一气呵成执行完,是分片的,但是当该线程又得到cpu占用时是接着它上次执行到的位置继续向下走,那么不管是一次执行完还是分片执行完,最终都是只有一个逻辑,即你的线程函数逻辑:Fun1Proc线程函数就只有一次输出逻辑,输出多次你觉得合理吗??

所以说线程的执行结果跟操作系统调度无关,而是跟线程函数逻辑有关!