我可以让Unix的pthread.h在Windows中编译吗?

时间:2010-01-27 22:53:39

标签: c windows multithreading pthreads

如果我尝试使用

编译程序
#include <pthread.h>

在其中,我收到错误:

pthread.h: No such file or directory

是否可以在Windows环境中进行编译?

我正在使用Vista和最新的MinGW。

我不想使用Microsoft Windows Services for UNIX Version 3.5,因为我必须将其移至Unix环境。

5 个答案:

答案 0 :(得分:46)

pthread.h是用于线程的Unix / Linux(POSIX)API的标头。像Cygwin这样的POSIX层可能会编译一个带有#include <pthreads.h>的应用程序。

本机Windows线程API通过#include <windows.h>公开,它的工作方式与Linux的线程略有不同。

但是,http://sourceware.org/pthreads-win32/还有一个替代的“胶水”库。请注意,它与MinGW / VS有一些轻微的不兼容性(例如,请参阅here)。

答案 1 :(得分:16)

正如@Ninefingers所提到的,pthreads只是unix-only。只有Posix,真的。

也就是说,微软确实有一个复制pthreads的库:

Microsoft Windows Services for UNIX Version 3.5

Library Download

答案 2 :(得分:11)

pthread.h不在Windows上。但Windows具有广泛的线程功能,从CreateThread开始。

我的建议是不要被另一个系统API的镜头看到WinAPI。这些系统不同。这就像坚持用舒适的Linux自行车座椅骑Win32自行车一样。好吧,座位可能不合适,在某些情况下它会掉下来。

线程在不同系统上的工作方式基本相同,您有ThreadPoolsmutexes。在使用pthreads和Windows线程之后,我可以说Windows线程提供的功能比pthread提供的功能要多得多。

学习另一个API非常简单,只需考虑概念(互斥等),然后查找如何在MSDN上创建其中一个。

答案 3 :(得分:4)

选择TDM-GCC 64x软件包。 (它保留了MinGW工具链的32位和64位版本,并且安装在一个简洁的安装程序中。)更重要的是,它包含一个名为“ winpthread ”库的东西。

它包含32位和64位的pthread.h标头,libwinpthread.alibwinpthread.dll.a静态库以及所需的.dlls libwinpthread-1.dll和{{1 (截至2016年6月1日)。

您需要在构建期间链接到libwinpthread_64-1.dll库。除此之外,您的代码可以与Linux上的本机Pthread代码相同。到目前为止,我已成功使用它在Windows上以64位编译一些基本的Pthread程序。

或者,您可以使用以下库将Windows线程API包装到pthreads API中: pthreads-win32

以上两种似乎是最为人熟知的方式。

希望这会有所帮助。

答案 4 :(得分:3)

我记得有两个用于windows的gnu工具链的发行版:mingw和cygwin。

我希望cygwin能够发挥作用 - 已经做了很多努力来使这个“标准”的posix环境。

mingw工具链使用msvcrt.dll作为其运行时,因此可能会暴露msvcrt的“线程”api:_beginthread,它在<process.h>中定义