【问题标题】:Multi-threading in C not working on single-core processor?C中的多线程在单核处理器上不起作用?
【发布时间】:2010-01-04 20:00:42
【问题描述】:

所以我刚刚从this website 运行了这个例子,它说输出应该像这样交替:

threadFunc 说:处理... main() 正在运行... threadFunc 说:处理... main() 正在运行...

但是在我的机器上它会产生这个:

threadFunc 说:处理... threadFunc 说:处理... main() 正在运行... main() 正在运行...

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

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

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

【问题讨论】:

  • 无法预测多线程程序(没有序列化)的输出将是什么。任何提出其他建议的网站都可能是可疑的。
  • 隐式声明意味着您没有为您的函数导入函数原型。找出该函数的正确头文件是什么。如果你不使用函数的结果并且你知道你传递了正确的类型,那么你可以在没有函数原型的情况下生存,但它有潜在的危险,你最好找到正确的头文件。跨度>
  • 来自man usleep 它说要添加#include <unistd.h>
  • @PP:我已经包含了#include <unistd.h>。出现此警告的任何其他原因?
  • 您使用的是什么操作系统?您是否在系统上输入了man usleep

标签: c multithreading


【解决方案1】:

你需要注释掉一行:

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

这样做会让它按您的预期工作

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

【讨论】:

  • 它不一定会按预期工作,尽管它更有可能。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            猜你喜欢
            • 2015-12-29
            • 1970-01-01
            • 1970-01-01
            • 2020-02-26
            • 1970-01-01
            • 2012-10-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多