您的位置:首页 > 其它

pthread 学习笔记

2014-04-10 18:34 393 查看
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但不碍事了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: