关于多线程时间片的问题

时间:2022-03-01 00:51:27
我需要在一台机子上模拟多人同时操作数据库,想用多线程模拟,为了尽可能的并发执行,第一个线程等待了 3*0.5,第二个等待了2*0.5,第三个等待1*0.5,第四个不等待,然后运行的时候出来的结果就很有意思了
第一次运行的结果是各个进程相互之间开始时间间隔了大概0.5秒,但马上再运行的话四个进程的开始时间完全一样。时间是我自己输出的,精确到0.00001秒。我是单CPU,在同一个时间点怎么能同时开始四个进程呢?小弟想不通,还请大家指点一下。

14 个解决方案

#1


没人?自己先顶

#2


1.这个时间不可能精确,线程何时开始何时调度根本无法预测的。
2.你所获得的时间也不过是计算机提供给你的,获取时间本身需要多少代码?获取到的时间的在我们看来相距太近,而对CPU来说,可以执行多少条指令?
3.不要去假设系统对线程的开始和调度,很有可能系统创建一个线程之后并不调度它而又立即去创建下一个线程。

#3


引用 2 楼 dancingbit 的回复:
1.这个时间不可能精确,线程何时开始何时调度根本无法预测的。
2.你所获得的时间也不过是计算机提供给你的,获取时间本身需要多少代码?获取到的时间的在我们看来相距太近,而对CPU来说,可以执行多少条指令?
3.不要去假设系统对线程的开始和调度,很有可能系统创建一个线程之后并不调度它而又立即去创建下一个线程。

可能我的出发点就是错误的,但是能解释一下我得到的结果么,我搞不明白为什么会那样

#4


1.这些线程可能被全部创建后才开始调度,而它们的开始时间从它们被创建的时候计算。
2.创建这些线程虽然要花费一定的时间,但由于CPU执行得太快,在你获取的时间里根本反映不出来。

#5


但我这边的时间是线程开始的时间,不是创建的时间,最主要的是我想知道为什么第一次执行会相差0.5秒,再次去执行的话时间就完全相通了呢?但是如果把程序关闭掉再次打开,那第一次执行的时候还是会差0.5秒,并且执行时间间隔稍长点的话(比如说一分钟),也会差0.5秒,就是说只有执行间隔非常短的时候,我得到的线程开始时间就会完全相同

#6


1.你怎么取的开始时间?
2.没有人知道Windows是根据什么来调度线程的。

#7


这个只是表象,没必要去研究这个,你要得到这个时间的话,就要通过IO输出,,但是这个IO的执行时间相对于cpu的时间片来说是非常的长的。。

#8


要用高精度的定时器。
你查查看。

#9


线程是个不稳定的东西,你不知道在你启动它或者在它运行的时候,操作系统里发生了什么变化,CPU如何处理,所谓的定时器也只是模糊的定时,不可能达到数值计算出来的精确程度。这跟计算机的硬件也是有关系的。如果你用银河系列的超级计算机,估计时间相差很小。不同的OS、cpu对定时器的使用肯定不一样。

#10


直接用测试软件就可以了,整那么麻烦干什么,自己写的有bug怎么办,
用测试软件测试出来的结果还是比较可信的

#11


引用 10 楼 lc329857895 的回复:
直接用测试软件就可以了,整那么麻烦干什么,自己写的有bug怎么办,
用测试软件测试出来的结果还是比较可信的

那能给推荐一个比较好的测试软件么

#12


这个很简单!
     楼主你漏了个东西
   那就是你的main所在的主线程 如何控制 开子线程的呢
     如果你是依靠循环 开启的 那肯定是  主线程 启动子线程   这两个线程就都预定了一部分时间片。而如果这时候 操作系统给分配的时间句柄还在主线程的话他就可以开启第二个线程。
     于是三个线程都预定了时间片。  和前面一样 只不过主线程 拿到时间片句柄的可能性在不断降低而已!
    所以你得到任何结果都是可能的!  这个没意义。

#13


给分给分

#14


揭帖,谢谢大家

#1


没人?自己先顶

#2


1.这个时间不可能精确,线程何时开始何时调度根本无法预测的。
2.你所获得的时间也不过是计算机提供给你的,获取时间本身需要多少代码?获取到的时间的在我们看来相距太近,而对CPU来说,可以执行多少条指令?
3.不要去假设系统对线程的开始和调度,很有可能系统创建一个线程之后并不调度它而又立即去创建下一个线程。

#3


引用 2 楼 dancingbit 的回复:
1.这个时间不可能精确,线程何时开始何时调度根本无法预测的。
2.你所获得的时间也不过是计算机提供给你的,获取时间本身需要多少代码?获取到的时间的在我们看来相距太近,而对CPU来说,可以执行多少条指令?
3.不要去假设系统对线程的开始和调度,很有可能系统创建一个线程之后并不调度它而又立即去创建下一个线程。

可能我的出发点就是错误的,但是能解释一下我得到的结果么,我搞不明白为什么会那样

#4


1.这些线程可能被全部创建后才开始调度,而它们的开始时间从它们被创建的时候计算。
2.创建这些线程虽然要花费一定的时间,但由于CPU执行得太快,在你获取的时间里根本反映不出来。

#5


但我这边的时间是线程开始的时间,不是创建的时间,最主要的是我想知道为什么第一次执行会相差0.5秒,再次去执行的话时间就完全相通了呢?但是如果把程序关闭掉再次打开,那第一次执行的时候还是会差0.5秒,并且执行时间间隔稍长点的话(比如说一分钟),也会差0.5秒,就是说只有执行间隔非常短的时候,我得到的线程开始时间就会完全相同

#6


1.你怎么取的开始时间?
2.没有人知道Windows是根据什么来调度线程的。

#7


这个只是表象,没必要去研究这个,你要得到这个时间的话,就要通过IO输出,,但是这个IO的执行时间相对于cpu的时间片来说是非常的长的。。

#8


要用高精度的定时器。
你查查看。

#9


线程是个不稳定的东西,你不知道在你启动它或者在它运行的时候,操作系统里发生了什么变化,CPU如何处理,所谓的定时器也只是模糊的定时,不可能达到数值计算出来的精确程度。这跟计算机的硬件也是有关系的。如果你用银河系列的超级计算机,估计时间相差很小。不同的OS、cpu对定时器的使用肯定不一样。

#10


直接用测试软件就可以了,整那么麻烦干什么,自己写的有bug怎么办,
用测试软件测试出来的结果还是比较可信的

#11


引用 10 楼 lc329857895 的回复:
直接用测试软件就可以了,整那么麻烦干什么,自己写的有bug怎么办,
用测试软件测试出来的结果还是比较可信的

那能给推荐一个比较好的测试软件么

#12


这个很简单!
     楼主你漏了个东西
   那就是你的main所在的主线程 如何控制 开子线程的呢
     如果你是依靠循环 开启的 那肯定是  主线程 启动子线程   这两个线程就都预定了一部分时间片。而如果这时候 操作系统给分配的时间句柄还在主线程的话他就可以开启第二个线程。
     于是三个线程都预定了时间片。  和前面一样 只不过主线程 拿到时间片句柄的可能性在不断降低而已!
    所以你得到任何结果都是可能的!  这个没意义。

#13


给分给分

#14


揭帖,谢谢大家