0. 说明
最近在写cross-platform程序,发现很多这样的程序多线程的实现都是用POSIX pthread。常在
Linux下开发,写惯了Linux程序,要写Windows下的东西还真有些不适应,很多标准MS的VC都是
不完全支持的,例如C99,所以尽量使用标准的东西来写。对于多线程,pthread确实是一个好的
选择。其实pthread官方发布的有windows版本的预编译库,但那是动态库,不习惯,编译好一个
文件,还要复制一大堆东西进去程序才能运行,麻烦。于是下源码自己编译了一个静态库,方便
自己,也方便大家使用。
1. 编译pthread-win32静态链接库
1.1 说明--为什么要编译pthread-win32版静态链接库
pthread-win32 release版本默认使用动态链接库,这样,在发布程序时要复制若干动态链接库
文件到程序目录,相对麻烦,使用源代码编译出一个可用的静态库是一个好办法。
1.2 下载
下载地址:
ftp://sourceware.org/pub/pthreads-win32
目前最新版是pthreads-w32-2-8-0-release.exe
1.3 建立vc6工程--原始vc6工程未必可用
1) 准备
将pthreads-w32-2-8-0-release.exe解压到任一目录,例如解压到
D:\Program Files\pthreads-w32-2-8-0-release
(编译和使用pthread-win32静态库以该目录为准)
下面有三个文件夹,Pre-built.2(头文件和已编译好的库)/pthreads.2(源码)/QueueUserAPCEx
File->New->Projects->Win32 Static Library
Location = D:\Program Files\pthreads-w32-2-8-0-release\pthreads.2
Project name = pthread2
2) 添加文件
Project->Add To Project->Files... 向上找将pthread.c加入到工程中
1.4 工程设置
1) 设置为release
Build->Set Active Project Configuration -> Win32 Release -> OK
2) 加入预编译宏
Project->Settings...->c/c++->Category:General
在Preprocessor definitions一项加入宏PTW32_STATIC_LIB(用逗号隔开)
3) 设置运行时库类型
Project->Settings...->c/c++->Category:Code Generation
Use Run-time library = Multithreaded
1.5 编译
1) 编译
F7编译
如果提示找不到sched.h等头文件,在vc6中加入头文件搜索路径:
Tools->Options... -> Directories->Show directories for->Include files->New
将D:\Program Files\pthreads-w32-2-8-0-release\pthreads.2添加到头文件搜索路径
2) 复制静态库文件
将release目录下编译好的pthread2.lib复制到
D:\Program Files\pthreads-w32-2-8-0-release\Pre-built.2\lib\pthread.lib
到这里我们就得到了pthread-win32静态链接库,可以测试一下了
2. 使用pthread-win32静态库
使用pthread-win32静态库要注意:
1) 在程序中要定义宏PTW32_STATIC_LIB
2) pthread-win32静态库中没有做attach和detach操作,要程序员来完成该任务,
否则线程有能成功创建。具体如下:
在程序入口(通常是main函数)处调用如下两个函数
pthread_win32_process_attach_np();
pthread_win32_thread_attach_np();
程序结束时调用
pthread_win32_thread_detach_np();
pthread_win32_process_detach_np();
没办法,windows系统有很多标准它都不支持,写起来就要麻烦点。
可以简单地这样处理:
a) 定义程序结束时的处理函数
#ifdef PTW32_STATIC_LIB
void pthread_win32_detach(void)
{
pthread_win32_thread_detach_np();
pthread_win32_process_detach_np();
}
#endif
b) 在程序入口处调用如下
#ifdef PTW32_STATIC_LIB
pthread_win32_process_attach_np();
pthread_win32_thread_attach_np();
atexit(pthread_win32_detach);
#endif
3. 测试程序
3.1 介绍
echo程序,支持linux和windows双平台,client发送一个消息给server, server显示收到的
消息并回传给client
3.2 服务端tcpd.c
Linux: 打开GNUC宏并关闭PTW32_STATIC_LIB
Windows: 关闭GNUC宏并打开PTW32_STATIC_LIB
3.3 客户端tcpc.c
Linux: 打开GNUC宏
Windows: 关闭GNUC宏
3.4 编译
Linux: make
Windows:
在编译器(vc6)中添加头文件和库的搜索路径
Tools->Options... -> Directories->Show directories for->Include files->New
添加D:\Program Files\pthreads-w32-2-8-0-release\Pre-built.2\include
Tools->Options... -> Directories->Show directories for->Library files->New
添加D:\Program Files\pthreads-w32-2-8-0-release\Pre-built.2\lib
3.5 链接
链接前需要在工程中设置run-time library为Multithreaded[同1.4 3)方法相同],否则可能出现链接错误
Written by eugene.liu @ 01/14/2011 XiAn
email: genelyq@gmai.com
- 1
- 2
- 3
- 4
- 5
- 6
前往页