一 环境
1. 包含头文件#include<pthread.h>)
2.编译时加上-lpthread参数
二 函数
1. int pthread_create(pthread_t*restrict tidp,const pthread_attr_t *restrict_attr,void*(*start_rtn)(void*),void *restrict arg); ----创建线程
返回值:
若成功则返回0,否则返回出错编号
参数
第二个参数是线程属性,一般设为NULL。
第三个参数是线程运行函数的起始地址,也就是函数名,该函数的返回值和参数都需要为void* 类型。
最后一个参数是运行函数的参数,该函数只有一个万能指针参数arg,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,把这个结构的地址作为arg的参数传入。
2. int pthread_join(pthread_t thread, void **retval); -------用来等待一个线程的结束
返回值:
0代表成功。 失败,返回的则是错误号。
参数:
thread: 线程ID。
retval: 用户定义的指针,用来存储被等待线程的返回值,一般设为NULL。
三 举例
void* test(void* context){
print "hello,world";
}
int main(){
pthread_t tid ;
ret = pthread_create(&tid, NULL,test,NULL);
pthread_join(tid,NULL);
return 0;
}
四 错误
1. pthread_create的返回值为0,但是test方法中的print语句并没有执行,开始以为缓冲区没有flush,加入flush(stdin)之后,print语句有时执行,有时不执行。原因是:没有调用pthread_join 函数,main函数的里的主进程很快结束,子线程还没来得及执行就结束了。
2. 创建了两个子线程A和B,main函数里调用pthread_join函数:B线程要等A线程创建成功之后才能创建,线程创建不稳定,目前在main函数里是通过sleep的方法实现。todo 有没有相应的函数或者是其它方式来实现。
3. todo:线程结束的方式(1.函数 2.return)