分类:
2008-12-09 18:58:37
11.4 thread creation
#include int pthread_create(pthread_t *restrict tidp,
const pthread_attr_t *restrict attr,
void *(*start_rtn)(void*), void *restrict arg); |
Returns: 0 if OK, error number on failure |
1.这个函数建立一个thread, 这个thread在建立后就立即可以执行了,他甚至可以在pthread_create函数返回之前执行,因此,如果在被建立的thread里面使用tidp这个变量,可能是危险的,因为pthread_create可能还没有返回,即改变量的数值可能还没有被设置成新建立的thread的id,建议在thread内部用pthread_self来获取id。也可能在主thread建立它之后,执行了别的工作之后还没有执行。
2.Thread有自己的errno,但是pthread的这些函数一般不使用它,而使用返回值来表示是否出错。保留 errno只是一个兼容新的考虑。因此不要去查看errno。
3.建立的thread会继承master
thread的signal
mask,但是已经是pending 的signals会被清除。
4. linux下,pthread是用进程来实现的,通过clone调用来建立一个与father共享memory以及file descriptor的进程,当作是线程。所以在linux下,调用pthread_create生成的thread的pid与master
thread的pid是不同的。
11.5. Thread Termination
一个thread可以有如下几种termination 的方法:
1.return
2. 调用pthread_exit
3. 被别的thread给cancel掉。
注意:如果一个thread调用exit类函数,那么整个进程就会退出,类似的,如果一个thread收到了一个会使其terminate的信号,那么整个进程也会终止。
#include void pthread_exit(void *rval_ptr); |
#include int pthread_join(pthread_t thread, void **rval_ptr); |
Returns: 0 if OK, error number on failure |
Pthread_exit这个函数的参数rval_prt的值也就等于pthread_join得到的值。如果Pthread_join会block,直到thread结束,得到其exit status与rval_prt中,并将thread置为detached状态。
还有应该注意的是:这几个函数使用的指针,所指向的位置,不应该是stack auto变量,最好是全局的,或者malloc出来的变量。
#include int pthread_cancel(pthread_t tid); |
Returns: 0 if OK, error number on failure |
这个函数仅仅是向thread发送一个requeset,要求其cancel。 他并不等待thread操作完成, 默认情况下,thread会作类似pthread_exit(PTHREAD_CANCELED)的动作。当然,thread可以将其request忽略。
#include
void pthread_cleanup_push(void (*rtn)(void *),
void *arg);
void pthread_cleanup_pop(int execute);
这两个函数负责,注册一些thread cancel handlers, 当thread退出时,如果满足一定条件,就逆序调用这些注册的handlers。所谓的条件:
1.Thread调用pthread_exit来退出。
2. thread被pthread_cancel来终止。
此外,pthread_cleanup_pop(n),n!=0也会触发handler的调用。
注意:由于pthread_cleanup_xxx函数有可能使用macro实现的,push函数中含有一个’{’字符,pop函数,含有一个‘}’字符,所以,要让这两个函数配对出现。否则可能编译不过去。
如下是thread和process的一些原语:
Figure 11.6. Comparison of process and thread
primitives |
||
Process primitive |
Thread primitive |
Description |
fork |
pthread_create |
create a new flow of control |
exit |
pthread_exit |
exit from an existing flow of control |
waitpid |
pthread_join |
get exit status from flow of control |
atexit |
pthread_cancel_push |
register function to be called at exit from flow of control |
getpid |
pthread_self |
get ID for flow of control |
abort |
pthread_cancel |
request abnormal termination of flow of control |
#include int pthread_detach(pthread_t tid); |
Returns: 0 if OK, error number on failure |
这个函数可以将一个thread置为detached,一个detached thread,在其terminate的时候,其内存可以立即被reclaim。