windows和Linux的pthread用法稍有不同。
windows:
1.下载pthreads-w32-2-8-0-release.exe
下载地址:ftp://sourceware.org/pub/pthreads-win32
2. 安装pthreads-w32-2-8-0-release.exe
双击pthreads-w32-2-8-0-release.exe,点击Browse选择安装到的目录,然后点击Extract解压,完成后点击Done。
之后会在安装目录看到有三个文件夹Pre-built.2、pthreads.2、QueueUserAPCEx.
第一个是生成库(头文件和库文件那些),第二个是源码,第三个不清楚,像是测试程序。
将Pre-built.2文件夹下的include和lib文件夹里的文件复制到VS2008对应的include和lib目录,我这里是C:\Program Files\Microsoft Visual Studio 9.0\VC\include和C:\Program Files\Microsoft VisualStudio 9.0\VC\lib.
程序中加入#include<pthread.h>和#pragma comment(lib, "pthreadVC2.lib") //必须加上
这样还是会出现丢失pthreadVC2.dll,把这个dll复制到和程序exe一个文件夹中。
#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS 5
void *PrintHello(void *threadid)
{
int tid;
tid = (int)threadid;
printf("Hello World! It's me, thread #%d!\n", tid);
pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
pthread_t threads[NUM_THREADS];
int rc, t;
for(t=0; t<NUM_THREADS; t++){
printf("In main: creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
pthread_exit(NULL);
}
这里需要注意的是
1、pthread_create的最后一个参数可以给函数PrintHello传参。
2、NUM_THREADS和OpenMP的num_threads设置时不一样的,想要8个线程运行程序,NUM_THREADS要设成7。这7个线程是主线程以外的线程运行。
Linux:
上面程序可以照搬,不过不需要加上#pragma comment(lib, "pthreadVC2.lib") ,编译的时候用g++ -o test test.cc -lpthread编译。
过程中出现一个问题是cast from ‘void*’ to ‘int’ loses precision,因为
int tid;
tid = (int)threadid;
电脑是64位的,指针长度是8字节,而int 型只有4字节,所以出错,64位机器上安装的VS没这个问题,大概是默认VS是32位的。
64位机器上long是8字节的,因此需要改为long型。
虽然还会有warning但不碍事了。