同一进程下的不同线程共享数据段,linux下的多线程遵循posix线程借口,称为pthread。编写linux下的多线程程序,需要使用pthread.h的头文件,连接时使用libpthread.a库。
int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,(void*)(*start_rtn)(void*),void *arg);
tidp:线程id,不是用来输入id,而是用来获取id。
attr:线程属性,通常为null
start_rtn:线程要执行的函数,线程要执行的程序要写成一个函数
arg:start_rtn的参数,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
若线程创建成功,则返回0。若线程创建失败,则返回出错编号,返回成功时由tidp指向的内存单元被设置为新创建线程的线程ID。
线程中用exit整个进程都退出,线程正常的退出:return返回;使用pthread_exit函数;子线程可以通过pthread_exit传递一个返回值,而主线程通过pthread_join获得该返回值,从而判断该子线程的退出是正常还是异常。
void pthread_exit(void *retval);retval为返回值
int pthread_join(pthread_t thread, void **retval);retval为二级指针,阻塞直到制定线程终止。
pthread_t pthread_self(void);获取线程自身id。pthread_t的类型为unsigned long int,所以在打印的时候要使用%lu方式,否则显示结果出问题。也可以直接使用在pthread_create中的id,但是要注意事先声明。
从pthread_cleanup_push到pthread_cleanup_pop之间程序段的终止动作(包括调用pthread_exit和异常终止,不包括return)都将执行pthread_cleanup_push指定的清理函数。
void pthread_cleanup_push(void (*routine)(void *), void *arg);routine是清除函数,arg是清除函数的参数。
void pthread_cleanup_pop(int execute);运行到pop时还没有终止动作,时候在弹出清理函数的同时执行该函数,非0执行,0不执行。
重点:
http://www.cnblogs.com/gmh915/archive/2010/06/11/1756067.html 讲解函数指针和指针函数
函数指针:int (*func)();指针函数int *func();一个是指针变量一个是函数
void *无类型指针,任何类型的指针都可以付给无类型指针,反之不可以
在自己写程序中发现int和void*强制转换有警告,后来发现64位系统int为4B,long为8B,指针为8B。所以int和void*强制转换有警告。
在pthread_creat中把函数参数地址输入,在函数中把void*类型转换为之前参数的类型,不需要繁琐的反复进程void*的转换。
pthread_cleanup_push和pthread_cleanup_pop必须成对出现相当于{}。
阅读(1984) | 评论(0) | 转发(0) |