C中的多线程无法在单核处理器上运行?

时间:2010-01-04 20:00:43

标签: c multithreading

所以我只是从this website运行了示例,它说输出应该像这样交替:

threadFunc says: processing...
main() is running...
threadFunc says: processing...
main() is running...

然而,在我的机器上,它产生了这个:

threadFunc says: processing...
threadFunc says: processing...
main() is running...
main() is running...

是不是因为我有一个不是多线程的单核处理器?

注意:我在编译时也收到此警告:implicit declaration of function ‘usleep’

我正在使用gcc编译:{{1​​}}

6 个答案:

答案 0 :(得分:3)

没有。同时写入同一位置的两个线程的输出顺序没有很好地定义,并且取决于很多因素。第一个线程可能比第二个线程早开始,并且可能在第二个线程有机会启动之前完成其工作。另一个选择是输出在线程中以某种方式缓冲,并且只在达到某个阈值后才刷新。

所有这一切都与您的处理器是单核的事实无关。在构思多核处理器之前,多线程运行良好。

如果要按照描述的方式交错输出,则需要使用某些同步机制,例如临界区或互斥锁。

答案 1 :(得分:3)

你需要注释掉一行:

pthread_join(pth, NULL /* void ** return value could go here */);

这样做会使它按预期工作

它的做法是让线程等到线程pth完成后再继续。

答案 2 :(得分:1)

不,使用usleep不是保证重新安排线程的方法。甚至sched_yield都不一定会做任何事情。如果必须交替执行,则必须使用条件变量或其他信号机制。请注意,仅使用互斥锁也不会这样做,因为它不一定会重新安排。

答案 3 :(得分:0)

多线程与机器上的核心数量没有直接关系:您可以在单个处理器上很好地实现多线程。

您看到的输出可能与OS线程/进程调度程序如何交叉线程有关(我没有按照您引用的站点的链接)。

答案 4 :(得分:0)

它应该仍然是多线程的;尝试使用循环迭代次数和/或usleep()次调用中的时间。也许你的调度程序行为不同,或者系统上的输出缓冲是不同的。

答案 5 :(得分:0)

在这些主题中做了什么?单核CPU应分时(交换)线程的执行。这取决于您的操作系统以及它的调度程序如何工作(以及您是否睡眠线程)。