主线程和子线程的时间片问题

时间:2022-01-15 02:05:49
主线程创建一个子线程,默认优先级,即,主线程和子线程优先级一样,创建的子线程为立即执行的,子线程是不是也要等到主线程的第一个时间片用完挂起时才能被执行吗?
如果主线程时间片用完但程序未完 ,就执行子线程,当子线程执行完后返回到主线程的哪个点?

10 个解决方案

#1


子线程是不是也要等到主线程的第一个时间片用完挂起时才能被执行吗?

对于只有一个cpu 单核,不支持多线程的电脑来说是这样的。因为每一时刻只能有一个线程在cpu上运行。这和他们的父子线程关系没关系。

主线程挂起之前执行到哪里就返回到哪里。每个线程在挂起前系统都会记录这个这个挂起时一瞬间的状态,线程获得时间片重新运行时会接着运行 就好像没有被挂起过一样。

#2


1 单核的话是的,但不一定是主线程的,有可能是其他程序线程挂起
2 时间片结束后cpu执行中断,将当前现场的信息保存下来,返回的时候再恢复现场。具体可以了解下cpu中断的相关文档

#3


线程并不知道自己被挂起过的。

#4


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

DWORD WINAPI fun1Proc(
LPVOID lpParameter
);

void main()
{

HANDLE hThread1;

hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);

CloseHandle(hThread1);

cout << "Main thread is runing" << endl;

cout << "A" << endl;
cout << "B" << endl;
cout << "C" << endl;
cout << "D" << endl;
cout << "E" << endl;

}

DWORD WINAPI fun1Proc(
LPVOID lpParameter
)
{
cout << "Thread1 is runing" << endl;

cout << "F" << endl;
cout << "G" << endl;
cout << "H" << endl;
cout << "I" << endl;
cout << "J" << endl;

return 0;
}

那结果为什么有两个main thread is runing ?

#5


Main thread is runing
Main thread is runing
Thread1 is runing 
A
F
B
G
C
H
D
I
E
J
Press any Key to continue

#6


引用 4 楼  的回复:
#include <windows.h>
#include <iostream.h>

DWORD WINAPI fun1Proc(
LPVOID lpParameter
);

void main()
{

HANDLE hThread1;

hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);

CloseHan……


iostream.h这种非标准头文件,一看就是VC6,VC6的iostream线程不安全,输出任何东西都不奇怪

珍惜生命,远离VC6

#7


我这边没有看到两个main thread is runing 只看到一个
引用 4 楼  的回复:
#include <windows.h>
#include <iostream.h>

DWORD WINAPI fun1Proc(
LPVOID lpParameter
);

void main()
{

HANDLE hThread1;

hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);

CloseHan……

#8


我在vs2010中把#include <iostream.h>改成了#include <iostream>
并加了一行using namespace std;
没有问题,可能问题真如ls说的。
学C++用dev c++或者 vs2010比较好

#9


引用 6 楼  的回复:
引用 4 楼 的回复:
hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL)……

那现在工作都用什么编译器?

#10


我在vs2008里试了,确实没问题,谢谢大家

#1


子线程是不是也要等到主线程的第一个时间片用完挂起时才能被执行吗?

对于只有一个cpu 单核,不支持多线程的电脑来说是这样的。因为每一时刻只能有一个线程在cpu上运行。这和他们的父子线程关系没关系。

主线程挂起之前执行到哪里就返回到哪里。每个线程在挂起前系统都会记录这个这个挂起时一瞬间的状态,线程获得时间片重新运行时会接着运行 就好像没有被挂起过一样。

#2


1 单核的话是的,但不一定是主线程的,有可能是其他程序线程挂起
2 时间片结束后cpu执行中断,将当前现场的信息保存下来,返回的时候再恢复现场。具体可以了解下cpu中断的相关文档

#3


线程并不知道自己被挂起过的。

#4


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

DWORD WINAPI fun1Proc(
LPVOID lpParameter
);

void main()
{

HANDLE hThread1;

hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);

CloseHandle(hThread1);

cout << "Main thread is runing" << endl;

cout << "A" << endl;
cout << "B" << endl;
cout << "C" << endl;
cout << "D" << endl;
cout << "E" << endl;

}

DWORD WINAPI fun1Proc(
LPVOID lpParameter
)
{
cout << "Thread1 is runing" << endl;

cout << "F" << endl;
cout << "G" << endl;
cout << "H" << endl;
cout << "I" << endl;
cout << "J" << endl;

return 0;
}

那结果为什么有两个main thread is runing ?

#5


Main thread is runing
Main thread is runing
Thread1 is runing 
A
F
B
G
C
H
D
I
E
J
Press any Key to continue

#6


引用 4 楼  的回复:
#include <windows.h>
#include <iostream.h>

DWORD WINAPI fun1Proc(
LPVOID lpParameter
);

void main()
{

HANDLE hThread1;

hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);

CloseHan……


iostream.h这种非标准头文件,一看就是VC6,VC6的iostream线程不安全,输出任何东西都不奇怪

珍惜生命,远离VC6

#7


我这边没有看到两个main thread is runing 只看到一个
引用 4 楼  的回复:
#include <windows.h>
#include <iostream.h>

DWORD WINAPI fun1Proc(
LPVOID lpParameter
);

void main()
{

HANDLE hThread1;

hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL);

CloseHan……

#8


我在vs2010中把#include <iostream.h>改成了#include <iostream>
并加了一行using namespace std;
没有问题,可能问题真如ls说的。
学C++用dev c++或者 vs2010比较好

#9


引用 6 楼  的回复:
引用 4 楼 的回复:
hThread1 = CreateThread(NULL,0,fun1Proc,NULL,0,NULL)……

那现在工作都用什么编译器?

#10


我在vs2008里试了,确实没问题,谢谢大家