多线程问题(时间片如何分配)

时间:2022-04-06 17:47:34
假设有一台多核的电脑,一个进程有多个线程:
问题1.线程创建后就可以运行了吗?
问题2.我知道操作系统是通过时间片分配策略来实现进程“并发”执行的,但是线程才是进程执行的单位,我查了一些资料,说时间片是根据进程来分配的,这让我很困惑,到底时间片是根据线程来分配,还是根据进程来分配?(如上面所述,如果一个进程有多个线程,如果时间片以进程来分配,那意思说一个进程永远只有一个线程在工作。这里就说不通了。)
问题3.如果一个进程的主线程很简单,但是子线程要处理很长时间,主线程只有等待子线程结束,才会结束吗?主线程的执行和子线程的执行会并发吗?还是说一旦创建子线程后,主线程就暂停,直到子线程运行结束,才继续执行主线程?

问题紧急,求助!
提前感谢!

6 个解决方案

#1


问题1:线程创建时可以指定状态的,也可以不让它创建的时候就运行
问题2:时间片这个不记得了,按进程或线程来分配的话都是可以有多个线程运行的,单核的话永远只会有一个线程,多线程是因为线程不断切换,感觉上的。认定一点,这个应该对程序员开发的时候来说是透明的,在多核的情况下,就可以真正地并行了。
问题3:主线程和子线程都会一起执行,主线程不会暂停,除非你代码控制。

以上是个人理解。

#2


时间片是按照线程来分配的。windows内核直接调度的单位只有线程,跟进程没关系。
但是进程是存在优先级高低的,windows通过进程优先级和线程相对优先级来决定一个最终的线程优先级。
只有最终同等级的线程才会执行时间片轮转,它们可能存在于不同进程中,也可能在同一进程中。

#3


感兴趣的话题,学习中。。。

#4


windows调度的基本单位是线程,不是进程。

windows的主线程可以先结束, 子线程可以在运行。但是不要用return 0退出。

可以用exitthread, 

windows的调度算法比较复杂,线程优先级和时间片轮训。

线程创建后不会立即执行, 创建很耗时间。所以createthread后,很可能会执行以后的代码。

#5


2012年的贴了

#6


1、创建出来的线程不一定马上就被执行,创建线程前可以把参数指定为线程挂起,什么时候取消挂起线程什么时候执行,当然默认情况下是创建线程后马上执行线程函数。
2、cpu是以线程为单位执行,是按线程分片,不是按进程分片。单核cpu一个时间片只执行一个线程,这样就体现出多核的优势了。
3、主线程结束和子线程结束没有关系,除你在主线程中WaitForSingle(子线程句柄),否则主线程结束了,子线程继续执行,直到进程中所有线程都执行完成后,退出进程;
主线程和子线程是并发执行的;

#1


问题1:线程创建时可以指定状态的,也可以不让它创建的时候就运行
问题2:时间片这个不记得了,按进程或线程来分配的话都是可以有多个线程运行的,单核的话永远只会有一个线程,多线程是因为线程不断切换,感觉上的。认定一点,这个应该对程序员开发的时候来说是透明的,在多核的情况下,就可以真正地并行了。
问题3:主线程和子线程都会一起执行,主线程不会暂停,除非你代码控制。

以上是个人理解。

#2


时间片是按照线程来分配的。windows内核直接调度的单位只有线程,跟进程没关系。
但是进程是存在优先级高低的,windows通过进程优先级和线程相对优先级来决定一个最终的线程优先级。
只有最终同等级的线程才会执行时间片轮转,它们可能存在于不同进程中,也可能在同一进程中。

#3


感兴趣的话题,学习中。。。

#4


windows调度的基本单位是线程,不是进程。

windows的主线程可以先结束, 子线程可以在运行。但是不要用return 0退出。

可以用exitthread, 

windows的调度算法比较复杂,线程优先级和时间片轮训。

线程创建后不会立即执行, 创建很耗时间。所以createthread后,很可能会执行以后的代码。

#5


2012年的贴了

#6


1、创建出来的线程不一定马上就被执行,创建线程前可以把参数指定为线程挂起,什么时候取消挂起线程什么时候执行,当然默认情况下是创建线程后马上执行线程函数。
2、cpu是以线程为单位执行,是按线程分片,不是按进程分片。单核cpu一个时间片只执行一个线程,这样就体现出多核的优势了。
3、主线程结束和子线程结束没有关系,除你在主线程中WaitForSingle(子线程句柄),否则主线程结束了,子线程继续执行,直到进程中所有线程都执行完成后,退出进程;
主线程和子线程是并发执行的;