【问题标题】:Threading in C, cross platformC中的线程,跨平台
【发布时间】:2011-04-10 17:57:47
【问题描述】:

我正在处理当前在单个线程上运行的现有项目(用 C 语言),我们希望在多个平台上运行并拥有多个线程。希望有一个用于此的库,因为,恕我直言,Win32 API 就像反复戳自己的眼睛。我知道 C++ 的 Boost.Thread,但是,它必须是 C(并且可以在 MinGW 和 gcc 上编译)。 Cygwin 不是一个选项,抱歉。

【问题讨论】:

  • 如果您认为CreateThread 反复戳自己的眼睛,您不应该尝试这样做。

标签: c multithreading concurrency cross-platform


【解决方案1】:

试试OpenMP API,它是多平台的,你可以用 GCC 编译它。

来自wikipedia的简要说明:

OpenMP(Open Multi-Processing)是一个应用程序编程接口 (API) 支持多平台共享内存多处理 使用 C、C++ 和 Fortran 编程,[3] 在大多数平台上,处理器 体系结构和操作系统,包括 Solaris、AIX、HP-UX、 Linux、macOS 和 Windows。它由一组编译器组成 影响的指令、库例程和环境变量 运行时行为。

【讨论】:

  • 在使用 OpenMP 一年多之后,我可以向所有阅读此问题的人保证,这是 100% 值得花时间的。
  • 链接断开,尝试编辑,但网站说我至少应该编辑 6 个字符...
【解决方案2】:

我会使用 POSIX 线程 API - pthread。本文有一些在 Windows 上实现它的提示,以及仅头文件下载(BSD 许可证):

http://locklessinc.com/articles/pthreads_on_windows/

编辑:我过去使用 sourceforge pthreads-win32 项目进行多平台线程,它工作得非常好。从那时起事情就发生了变化,上面的链接似乎是最新的,虽然我还没有尝试过。这个答案当然假设 pthread 在您的非 Windows 目标上可用(对于 Mac / Linux,我应该认为它们是,甚至可能是嵌入式的)

【讨论】:

  • 我会选择这个,所以 +1。
【解决方案3】:

与 Linux 相比,Windows 线程具有足够不同的功能,因此也许您应该考虑两种不同的实现,至少在应用程序性能可能成为问题的情况下。另一方面,简单地实现多线程可能会使您的应用程序比以前慢。让我们假设性能是一个问题,而多线程是最好的选择。

对于 Windows 线程,我特别考虑了 I/O 完成端口 (IOCP),它允许实现 I/O 事件驱动的线程,从而最有效地利用硬件。

许多“经典”应用程序是根据一个线程/一个套接字(/一个用户或类似)概念构建的,其中同时会话的数量将受到调度程序处理大量线程 (>1000) 的能力的限制。 IOCP 概念允许将线程数限制为系统中的内核数,这意味着调度程序将无事可做。线程只有在 I/O 事件发生后 IOCP 释放它们时才会执行。线程为 IOC 服务,(通常)启动新的 I/O 并返回以在 IOCP 处等待下一次完成。在释放线程之前,IOCP 还将提供完成的上下文,以便线程“知道”IOC 属于哪个处理上下文。

IOCP 概念完全消除了轮询,这是一种极大的资源浪费,尽管“等待多个对象”轮询在某种程度上是一种改进。上次我看到 Linux 与 IOCP 完全不同,因此与具有 IOCP 的 Windows 应用程序相比,Linux 多线程应用程序的构建方式将完全不同。

在真正高效的 IOCP 应用程序中,存在如此多的 IO(或者更确切地说是输出)排队到所涉及的 IO 资源的风险,导致系统用尽非分页内存来存储它们。相反,在真正低效的 IOCP 应用程序中,存在过多输入排队(等待服务)以致在尝试临时缓冲它们时会耗尽非分页内存的风险。

【讨论】:

    【解决方案4】:

    如果有人需要一个可移植且轻量级的 C 线程解决方案,请查看 plibsys 库。它为您提供线程管理和同步,以及其他有用的功能,如可移植套接字实现。支持所有主要操作系统(Windows、Linux、OS X),还支持各种其他不太流行的操作系统(即 AIX、HP-UX、Solaris、QNX、IRIX 等)。在每个平台上,仅使用本机调用来最小化开销。该库完全包含定期运行的单元测试。

    【讨论】:

      【解决方案5】:

      glib threads可以跨平台编译。

      【讨论】:

      • 我再也不会为 C 使用对象包装器了。对不起,我已经完成了 glib。
      • 到处都在使用。你的问题是什么?
      【解决方案6】:

      这里的“最好”/“最简单”/...答案肯定是 pthreads。它是 Unix/POSIX 系统上的本机线程架构,在 Windows 上几乎同样有效。不用再看了。

      【讨论】:

      • 在不使用win32 API的情况下会在windows上编译吗?
      • 如果不使用 Win32 API,Windows 上就不可能有线程,就像没有内核黑客或使用 pthreads API 的 Unix 上不可能有线程一样。您是否需要担心应用程序中的 Win32 API?不,这就是为什么有一个 pthreads-win32 库与 MinGW 一起提供的原因。请记住,虽然该库与 MSVC 一起使用,但它不是您通过 Visual Studio 获得的 Windows SDK 的一部分。但我隐含地假设你会使用 MinGW。
      【解决方案7】:

      鉴于您受到 C 的限制。我有两个建议:

      1) 我见过一个项目(类似于你的),它必须在 Windows 和 Linux 上使用线程运行。它的编写方式是它(相同的代码库)在 Linux 上使用 pthreads,在 Windows 上使用 win32 线程。这是通过有条件的 #ifdef 语句实现的,只要需要创建线程,例如

      #ifdef WIN32
      
      //use win32 threads
      
      #else
      
      //use pthreads
      
      #endif
      

      2) 第二个建议可能是使用 OpenMP。您是否考虑过 OpenMP?

      如果我遗漏了什么或者您想了解更多详情,请告诉我。我很乐意提供帮助。

      最好, 克里希纳

      【讨论】:

      • 如果我想这样做,那么我就不会要求库,因为我说我想要一些不使用 win32 API 的东西。
      【解决方案8】:

      根据我的经验,Windows 的 C 语言中的多线程与 Win32 API 密切相关。框架支持的其他语言(如 C# 和 JAVA)也与这些核心库相关联,同时提供它们的线程类。

      不过,我确实在 sourceforge 上找到了一个 openthreads API 平台,它可能会对您有所帮助:

      http://openthreads.sourceforge.net/

      API 是根据 Java 和 POSIX 线程标准建模的,

      我自己没有尝试过,因为我目前不需要在我的 C/C++ 项目上支持多个平台。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-02
        • 2011-04-14
        • 1970-01-01
        • 2010-12-25
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 2011-10-21
        相关资源
        最近更新 更多