POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32。
下载源码
源码主页:https://sourceware.org/pthreads-win32/
ftp地址:ftp://sourceware.org/pub/pthreads-win32
上面的ftp地址不知何故无法连接,另外找了个资源:
https://www.mirrorservice.org/sites/sourceware.org/pub/pthreads-win32/
下载最新版本pthreads-w32-2-9-1-release.zip解压得到三个文件夹
pthreads.2
pthreads.2 里面包含了pthreads 的源代码;
Pre-built.2
Pre-build.2 里面包含了pthreads for win32 的头文件和已编译好的库文件;
QueueUserAPCEx
QueueUserAPCEx 里面是一个alert的driver,编译需要DDK 。Windows Device Driver Kit (NTDDK.h) 需要额外单独安装。
若无特殊需求,直接引用Pre-built.2里面的文件即可。
使用方法
-
Pre-built.2下有三个文件夹
-
dll
动态链接库
-
include
头文件
-
lib
静态链接库
这里提供两种使用方式,一种是把头文件和静态库放到IDE的安装目录,动态库放到系统目录,这样VS的工程无需其他配置就可以直接使用pthread相关API,虽然取巧但省事;另一种的是对VS工程单独引用,开发日常操作了。
VS2017与VS2019同理,已测试通过。
选择一、全局引用
配置头文件
把include文件夹下的头文件拷贝到vs2017安装目录下
D:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\include\
配置静态链接库
把lib文件夹下的静态库文件拷贝到vs2017安装目录下
D:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.11.25503\lib
配置动态链接库
Pre-built.2\dll\x86下的文件拷贝到C:\Windows\SysWOW64目录下
Pre-built.2\dll\x64下的文件拷贝到C:\Windows\System32目录下
选择二、项目引用
我在解决方案目录新建了个ThirdPartyLib目录,与项目目录同级,并把Pre-built.2下的三个文件夹拷过来。
右键项目 - 属性 - 配置属性 - C/C++ - 添加附加包含目录
…\ThirdPartyLib\include;
右键项目 - 属性 - 配置属性 - 链接器 - 添加32位平台的附加库目录
…\ThirdPartyLib\lib\x86;
右键项目 - 属性 - 配置属性 - 链接器 - 添加64位平台的附加库目录
…\ThirdPartyLib\lib\x64;
右键项目 - 属性 - 配置属性 - 调试 - 环境 - 配置32位平台环境
path=%path%;…/ThirdPartyLib/dll/x86;
右键项目 - 属性 - 配置属性 - 调试 - 环境 - 配置64位平台环境
path=%path%;…/ThirdPartyLib/dll/x64;
测试
#include <pthread.h>
#include <stdio.h>
#include <windows.h>
#pragma comment(lib,"pthreadVC2.lib")
void* thread(void* val)
{
int value = *((int*)val);
printf("value: %d \n", value);
while(value-- > 0)
{
printf(" %d \n", value);
}
return NULL;
}
int main()
{
pthread_t tid;
int value = 100;
pthread_create(&tid, 0, thread, &value);
system("pause");
return 0;
}
编译错误C2011 “timespec”:“struct”类型重定义
可修改pthread.h文件,在
#if !defined( PTHREAD_H )
#define PTHREAD_H
下面加上一行宏定义
#define HAVE_STRUCT_TIMESPEC
可以解决“timespec”:“struct”类型重定义错误
至此,已经可以在VS2017中使用。如果不想改动到VS2017的目录和系统目录,可以通过配置工程项目属性,设置附加包含目录/链接器附加依赖库等选项,从而达到使用pthread库的目的。