线程的创建:
intpthread_create( pthread_t *thread,//用于返回创建的线程ID(传出参数)
pthread_addr_t *arr,//用于指定的被创建的线程的属性,上面的函数中使用NULL,表示使用默认的属性
void*(*start_routine)(void *),//指向线程被创建后要调用的函数
void *arg);//用于给线程调用的函数(start_routine)传递参数
返回值:若成功,返回0;否则返回错误编号
Eg. err = pthread_create(&ntid, NULL ,thr_fn ,NULL);//thr_fn为调用的函数
线程创建时,并不能保证哪个线程会先运行,新创建的线程可以访问进程的地址空间,并且继承调用线程的浮点环境和信号屏蔽字,但是该线程的未决信号集被清除。
线程的终止:
线程的终止包括两大类:主动终止和被动终止
l主动终止
1.线程过程函数执行return正常返回,返回值是线程的退出码;
2.线程调用pthread_exit函数。
Void pthread_exit(void*rval_ptr);
rval_ptr 线程的返回值,即终止状态。
l被动终止
1.在其他线程中调用pthread_cancel函数;
int pthread_cancel(pthread_t tid);
默认情况下,该函数的效果相当于在线程 tid 中调用pthread_exit((void*)PTHREAD_CANCEL)函数。
2.任意线程调用exit、_Exit或者_exit导致整个进程退出。
线程和进程函数的对比:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.int pthread_join(pthread_tthread,void ** rval_ptr)
返回值:若成功返回0,若失败返回错误编号
调用线程将一直阻塞,直到指定的线程调用pthread_exit,从启动例程中返回或者被取消。
如果线程只是从它的启动例程返回,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元被置为PTHREAH_CANCELED.
可以通过调用pthread_join自动把线程置于分离状态,这样资源就可以恢复。如果线程已经处于分离状态,pthread_join调用就会失败,返回EINVAL.
如果对线程的返回值并不感兴趣,可以把rval_ptr置为NULL。在这种情况下,调用pthread_join函数将等待指定的线程停止,但并不获取线程的终止状态。
线程可以安排它退出时需要调用的函数(就是线程退出时希望执行那些函数),这样的函数称为线程清理处理程序。一个线程可以建立多个清理处理程序,处理程序记录在栈,也就是说,他们执行的顺序与其注册时相反。而且push和pop也必须成对调用。
2. void pthread_cleanup_push(void(*rtn)(void *),void *arg)
3. void pthread_cleanup_pop(int execute);
push对清理函数(rtn)进行注册;如果execute参数置为0,清理函数将不被调用。无论哪种情况,pthread_cleanup_pop都将删除上次pthread_clean_push调用建立的清理处理程序。
清理函数调用的时机:
线程还未执行 pthread_cleanup_pop 前,被 pthread_cancel 取消 线程还未执行 pthread_cleanup_pop 前,主动执行 pthread_exit 终止 线程执行 pthread_cleanup_pop,且 pthread_cleanup_pop 的参数不为 0.
注意:如果线程还未执行 pthread_cleanup_pop 前通过 return 返回,是不会执行清理函数的。
4. int pthread_cancel(pthread_t tid);
说明:请求取消同一进程中的其他线程,但是线程可以选择忽略取消或者控制如何被取消。注意,它并不等待线程终止,它仅仅是提出请求。
5. pthread_t pthread_self(void);
返回值:调用线程的线程ID
关于线程终止的补充:
pthread_cancel函数发送终止信号
pthread_setcancelstate函数设置终止方式
pthread_testcancel函数取消线程(另一功能是:设置取消点)intpthread_setcancelstate(intstate,int*oldstate)
设置本线程对Cancel信号的反应,state有两种值:PTHREAD_CANCEL_ENABLE(缺省)和PTHREAD_CANCEL_DISABLE,分别表示收到信号后设为CANCLED状态和忽略CANCEL信号继续运行;old_state如果不为NULL则存入原来的Cancel状态以便恢复。
intpthread_setcanceltype(inttype,int*oldtype)
设置本线程取消动作的执行时机,type由两种取值:PTHREAD_CANCEL_DEFFERED和PTHREAD_CANCEL_ASYCHRONOUS,仅当Cancel状态为Enable时有效,分别表示收到信号后继续运行至下一个取消点再退出和立即执行取消动作(退出);oldtype如果不为NULL则存入运来的取消动作类型值。