由于时间成本,不想使用Windows线程API,因此想用pthread线程库;但pthread是Linux默认的POSIX线程库,Windows中并不自带,需要自己配置。
因为pthread遵循POSIX标准,因此其在Windows中使用应该和Linux中大同小异。
pthread库的基本使用参考:
Linux线程:线程的创建、属性、回收、退出、取消_linux线程销毁的方式-CSDN博客
Linux线程:互斥锁mutex的使用_linux线程互斥锁的使用方法-CSDN博客
Linux线程:读写锁的使用_linux 读写锁函数-CSDN博客
Linux线程:条件变量_linux线程条件变量-CSDN博客
1. 下载
https://github.com/GerHobbelt/pthread-win32
2. 生成库文件
S1:解压后,进入目录:\pthread-win32-master\windows\VS2022;
S2:打开.sln文件;
S3:分别将项目pthread_dll、pthread_static_lib编译生成动态库、静态库;生成的库文件在目录\pthread-win32-master\windows\VS2022\bin\Debug-Unicode-64bit-x64下。
3. 配置项目
新建VS项目,创建空白的.c或.cpp源文件;
打开项目属性。
①添加头文件路径。
将路径\pthread-win32-master加入到项目中,如下:
②添加lib库文件路径。
将解压后文件中的include目录路径加入到项目中,如下:
③添加库文件名称。
将\pthread-win32-master\windows\VS2022\bin\Debug-Unicode-64bit-x64目录下的如下两个.lib文件的名称加入到项目中,如下:
④添加动态库
将\pthread-win32-master\windows\VS2022\bin\Debug-Unicode-64bit-x64目录下的pthread.dll文件复制到项目文件夹中:
4. 编码测试
打开创建的.c或者.cpp源文件,测试如下代码:
#include<stdio.h>
#include<pthread.h>
#include<string.h>
void threadFunc() {
Sleep(100);
for (int i = 0; i < 10; i++) {
printf("thread 01: %d\n", i);
}
}
int main() {
pthread_t tid;
void* r = NULL;
memset(&tid, 0, sizeof(tid));
ret = pthread_create(&tid, NULL, threadFunc, NULL);
Sleep(100);
for (int i = 0; i < 10; i++) {
printf("Main thread: %d\n", i);
}
pthread_join(tid, &r);
return 0;
}
运行结果:
备注:
使用时发现该pthread库和Linux中的pthread库有所区别:
(1)pthread_t类型在Linux中为基本类型的别名,而在Windows中为一个结构体,因此需使用memset进行初始化,而不是直接赋值;使用pthread_self()获取线程号时,应该变为获取其中的结构体成员。
(2)pthread_detach使用有问题,Linux中子线程detach后,其资源就由内核回收了,此时若主线程先结束的话,也不影响子线程的继续运行;而在Windows中使用时发现,子线程detach后,主线程结束仍会将子线程结束掉。暂无时间深究该问题。