多线程测试中,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楼的,你的线程在输出一次以后,生命期已经结束,线程已经退出了,所以不会再次输出了!
------解决思路----------------------
你在主线程中开了一个线程出来,这个线程跟主线程逻辑上就没有任何关系了,两个线程之间是异步执行的(因为你没有进行同步控制,即使你进行了同步控制,那也是逻辑上的关系,而不是功能上的关系),至于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线程函数就只有一次输出逻辑,输出多次你觉得合理吗??
所以说线程的执行结果跟操作系统调度无关,而是跟线程函数逻辑有关!
代码如下:
#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楼的,你的线程在输出一次以后,生命期已经结束,线程已经退出了,所以不会再次输出了!
------解决思路----------------------
你在主线程中开了一个线程出来,这个线程跟主线程逻辑上就没有任何关系了,两个线程之间是异步执行的(因为你没有进行同步控制,即使你进行了同步控制,那也是逻辑上的关系,而不是功能上的关系),至于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线程函数就只有一次输出逻辑,输出多次你觉得合理吗??
所以说线程的执行结果跟操作系统调度无关,而是跟线程函数逻辑有关!