Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的多线程在单核处理器上不工作?_C_Multithreading - Fatal编程技术网

C中的多线程在单核处理器上不工作?

C中的多线程在单核处理器上不工作?,c,multithreading,C,Multithreading,因此,我刚刚运行了来自的示例,它说输出应该如下所示: threadFunc says: processing... main() is running... threadFunc says: processing... main() is running... threadFunc说:处理。。。 main()正在运行。。。 threadFunc说:处理。。。 main()正在运行。。。 但是,在我的机器上,它会产生以下结果: threadFunc says: processing... thre

因此,我刚刚运行了来自的示例,它说输出应该如下所示:

threadFunc says: processing... main() is running... threadFunc says: processing... main() is running... threadFunc说:处理。。。 main()正在运行。。。 threadFunc说:处理。。。 main()正在运行。。。 但是,在我的机器上,它会产生以下结果:

threadFunc says: processing... threadFunc says: processing... main() is running... main() is running... threadFunc说:处理。。。 threadFunc说:处理。。。 main()正在运行。。。 main()正在运行。。。 是因为我有一个不是多线程的单核处理器吗

注意:我在编译时也收到了这个警告:
函数“usleep”的隐式声明


我使用gcc进行编译,就像这样:
gcc new.c-o new-lpthread

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


您看到的输出可能只是与操作系统线程/进程调度器如何交错线程有关(我没有按照您正在引用的站点的链接进行操作)。

它仍然应该正确地执行多线程;尝试在
usleep()
调用中处理循环迭代次数和/或时间。可能是您的计划程序运行方式不同,或者系统上的输出缓冲区不同。

这些线程正在执行什么操作?单核CPU应该分时(交换)线程的执行。这取决于您的操作系统及其调度程序的工作方式(以及您是否睡眠线程)

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

所有这些都与处理器是单核这一事实无关。在设计多核处理器之前,多线程技术已经很好地工作了


如果您想按照您描述的方式交错输出,则需要使用一些同步机制,如关键部分或互斥锁。

否,使用
usleep
不能保证重新调度线程。即使是
sched_yield
也不一定能做任何事情。如果必须交替执行,则必须使用条件变量或其他信号机制。请注意,仅仅使用互斥锁也不能做到这一点,因为它不一定会重新安排时间。

您需要在第行注释:

pthread_join(pth, NULL /* void ** return value could go here */);
这样做会使它像你期望的那样工作


它的作用是让线程等待线程
pth
完成后再继续。

不可能预测多线程程序(没有序列化)的输出。任何一个网站提出相反的建议都是可疑的。隐式声明意味着你没有为你的函数导入函数原型。找出该函数的正确头文件。如果你不使用函数的结果,并且你知道你正在向它传递正确的类型,那么你可以在没有函数原型的情况下生存,但是这有潜在的危险,你最好找到正确的头文件。从
man usleep
中,它说要添加
\include
@PP:我已经包含了
\include
。出现此警告的任何其他原因?您使用的是什么操作系统?您是否在系统上键入了
man-usleep
?它不一定会按预期工作,但很可能会按预期工作。