【问题标题】:Current right way to do thread programming in Linux当前在 Linux 中进行线程编程的正确方法
【发布时间】:2010-10-10 12:49:24
【问题描述】:

我知道过去 Linux 内核和 libc 中线程的实现经历了很大的变化。今天从 C 程序中使用线程的最佳方式是什么? (我什至不知道是否有多个 API 可以使用——我只知道 pthreads)

我不太关心旧内核和 libc 版本,但我确实关心有效利用多个内核和可移植性(我可能希望我的代码也可以在其他 Unix 上工作)。

如果我只使用 man 7 pthreads 中描述的 Posix 线程并将我的代码限制为 POSIX API,那可以吗?

编辑:感谢所有回答的人。我确实想过使用一些可用的线程池库,但对于这个项目来说,这真的不是一个选择。

【问题讨论】:

    标签: c linux pthreads


    【解决方案1】:

    在大多数情况下,是的。这就是 POSIX 的重点。您计划移植到的每个平台(包括操作系统、内核编号和体系结构)可能都有一些您需要注意的差异。这是你的家庭作业:)

    另外,作为一条建议,Qt 之类的框架和 Boost 之类的库包使这项工作变得更加优雅。如果您可以集成它们,我强烈推荐它。

    【讨论】:

      【解决方案2】:

      POSIX 线程是一个不错的选择,也是一种流行的线程。在使用 C/C++ 编程时,您可能还想查看 Boost ThreadsIntel Thread Building Blocks 的其他选项,而不是直接编码到 POSIX API。具体来说,英特尔 TBB 声称以易于使用和高效的方式使用多核处理器。我在 TBB 方面没有太多经验,但我见过使用 TBB 显着减少代码大小和复杂性的演示,并且运行速度比使用由经验丰富的工程师编写的 POSIX 线程以直接 C++ 编写的实现快几个数量级。

      【讨论】:

      • 谢谢!由于 C++ 不是该项目的选项,我想我将使用 POSIX API...
      【解决方案3】:

      使用线程很困难并且容易出错。如果可能,请避免直接对其进行编程。可以在 here 找到一篇写得很好的论文。

      除了直接使用线程之外,还可以通过多种不同的方式实现多核并行。最直接的就是多进程并行。对于 n 个核心,运行 n 个进程并在它们之间细分工作负载。当任务是粗粒度的并且需要很少或不需要它们之间的通信时,这是最合适的。当它必须在进程中时,您可以使用消息传递来进行线程之间的所有通信和同步,并尝试始终将不可变对象作为消息传递。

      【讨论】:

      • 多进程无法在同一台机器上很好地扩展,通常需要 3-4 倍于小任务的工作量(因为您需要实现一种通信机制,但仍然存在潜在的死锁,活锁,以及所有其他不受欢迎的“锁”类型)。但是,如果您可以放弃这种方法,您可能会获得更多的加速,因为您可以减少算法中的阻塞量。
      • 感谢@San 的评论。你说的对;如果进程之间需要大量通信,则多个进程不能很好地扩展。我已经修改了我的答案以澄清这一点。
      猜你喜欢
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多