穿越C语言,跨平台

时间:2011-04-10 17:57:47

标签: c multithreading concurrency cross-platform

我正在处理当前在单个线程上运行的现有项目(在C中),我们希望在多个平台上运行并且具有多个线程。希望有一个库,因为,恕我直言,Win32 API就像是在反复盯着自己。我知道Boost.Thread for C ++,但是,这必须是C(并且可以在MinGW和gcc上编译)。对不起,Cygwin不是一个选择。

8 个答案:

答案 0 :(得分:9)

尝试OpenMP API,它是多平台的,您可以使用GCC进行编译。

wikipedia

的简要说明
  

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

答案 1 :(得分:6)

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

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

编辑:过去我使用sourceforge pthreads-win32项目进行多平台线程处理,效果非常好。事情已经发生了变化,上面的链接似乎更新,尽管我没有尝试过。这个答案当然假设你的非Windows目标上有pthreads(对于Mac / Linux我应该认为它们是,甚至可能是嵌入式的)

答案 2 :(得分:4)

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

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

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

IOCP概念完全取消了轮询,这是一个很好的资源浪费,尽管“等待多个对象”轮询有所改善。我最后一次看到Linux没有像IOCP那样远程,因此与具有IOCP的Windows应用程序相比,Linux多线程应用程序的构建方式会有很大不同。

在真正高效的IOCP应用程序中,存在这样的风险:如此多的IO(或更确切地说是输出)排队到IO资源,系统耗尽非分页内存来存储它们。相反,在效率非常低的IOCP应用程序中,存在这样的风险,即在尝试暂时缓冲它们时,非分页内存排队等待(等待服务)非页面内存耗尽。

答案 3 :(得分:2)

glib threads可以跨平台编译。

答案 4 :(得分:1)

鉴于你受C限制。我有两个建议:

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

#ifdef WIN32

//use win32 threads

#else

//use pthreads

#endif

2)第二个建议可能是使用OpenMP。你有没有考虑过OpenMP?

如果我错过了什么或者您想了解更多细节,请告诉我。我很乐意提供帮助。

最佳, 克里希纳

答案 5 :(得分:1)

这里的“最好”/“最简单”/ ......答案肯定是pthreads。它是Unix / POSIX系统上的本机线程架构,在Windows上运行得非常好。无需进一步了解。

答案 6 :(得分:1)

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

答案 7 :(得分:0)

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

但是,我确实在sourceforge上找到了一个可以帮助你的openthreads API平台:

http://openthreads.sourceforge.net/

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

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