穿越C语言,跨平台

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

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

来自维基百科的简要描述:

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

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

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

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

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

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

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

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

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

glib线程可以跨平台编译。

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

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

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

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

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

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

最好的,克里希纳

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

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

http://openthreads.sourceforge.net/

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

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

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