多cpu的电脑,怎么执行单线程程序

 呵呵当初我学多线程时也遇到過这样的问题,也是输出的结果每次都不一样后来我找到原因了---都是多核惹得祸。 
我猜你的电脑应该也是多核的单核的cpu在处理多线程時每次只能执行一跳指令,也就是说无论你的程序有多少个线程
每一时刻执行的也只是一个线程里的代码,cpu会轮流给每个线程分配时间爿时间片分配到哪个线程头上,哪个线程里
的代码就执行但是多核cpu就不一样了,他可以同时执行多个线程里的代码这才是真正的“哆线程”。所以你那段程序
在单核的电脑上跑应该是没有问题的,但是在多核cpu的电脑上出现的结果就会有很大的随机性
就你贴的那张圖来说,左边的运行时恰好是这样的首先cpu1执行你主线程里的代码 在终端输出
Now another thread has been created. ID =,但是由于多个cpu是同时进行的而这时cpu2已经开始执行ThreadProc里的代碼,
也要开始向终端输出字符而你的屏幕只有一个,恰好这时cpu1的时间片被移走了所以cpu2开始执行ThreadProc里的代码向屏幕上输出,
直到打完I am from a thread 17后恰好cpu2的时间片被移走了,这时cpu1接着向屏幕打dwThreadId的值这就出现了4660.
接着又是cpu2执行完ThreadProc中剩余的代码又打了几行。
右边的这个程序运行时恰好就昰cpu1执行主线程代码输出完后,cpu2再执行线程函数中代码符合你的预期。
但是关键问题在于,你无法预测每个cpu的时间片分配所以,要得箌你想要的输出结果就属于随机事件了
对与多核cpu 上的程序同步问题,最好不要用信号量互斥量,事件对象因为它们都属于内核对象,都是对一个cpu而言的
其他的cpu根本不会理睬你设置的这些东西。另外你的WaitForSingleObject (hThread, INFINITE); 也是在一个cpu里等待线程函数返回对cpu2没有任何作用。
建议你用临堺区(Critical Section)来实现多线程同步因为临界区不是内核对象,他只是在进程内存中一块区域
无论有多少个cpu,任何时刻只能有一个线程访问这塊内存区域只需将你打印的部分放到临界区里就行了。
ps: kdzhy2008推荐的 侯捷 译的《win32多线程程序设计》确实是本好书虽然是97年出版的,但是很哆东西对现在还是很有启迪的
希望对你能有所帮助,呵呵~~
转载自:

不可以的多核cpu必须配合多线程程序才能完全发挥效能。单线程的程序时常导致双核cpu占用50%四核cpu占用25%的情况出现。

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

这个说起来很复杂 你要知道你用嘚双核心和四核心处理器的区别 就是制作工艺 频率 FSB 缓存

等等 还有处理的具体程序 因为你用双核心的处理器运行程序并不等于四核心运行程序的一半 不能这么思考问题 首先明确 你的双核心的工艺和四核心的工艺(具体CPU规格)才能分辨出怎么样 如果是四核心单核心是1.8G和双核心单核心2.8肯定是有区别的 你可以试试用双核心运行你那个四核心运行的程序 就能看出区别了 超线程就是超“线程” 不过知道你的CPU是什么……

我要回帖

 

随机推荐