Chinaunix首页 | 论坛 | 博客
  • 博客访问: 993446
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

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可能还没有返回,即改变量的数值可能还没有被设置成新建立的threadid,建议在thread内部用pthread_self来获取id。也可能在主thread建立它之后,执行了别的工作之后还没有执行。

2Thread有自己的errno,但是pthread的这些函数一般不使用它,而使用返回值来表示是否出错。保留 errno只是一个兼容新的考虑。因此不要去查看errno

3.建立的thread会继承master threadsignal mask,但是已经是pending signals会被清除。

4. linux下,pthread是用进程来实现的,通过clone调用来建立一个与father共享memory以及file descriptor的进程,当作是线程。所以在linux下,调用pthread_create生成的threadpidmaster threadpid是不同的。

11.5. Thread Termination

一个thread可以有如下几种termination 的方法:

1return

2. 调用pthread_exit

3. 被别的threadcancel掉。

注意:如果一个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_joinblock,直到thread结束,得到其exit statusrval_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。所谓的条件:

1Thread调用pthread_exit来退出。

2. threadpthread_cancel来终止。

此外,pthread_cleanup_pop(n)n!=0也会触发handler的调用。

注意:由于pthread_cleanup_xxx函数有可能使用macro实现的,push函数中含有一个’{’字符,pop函数,含有一个‘}’字符,所以,要让这两个函数配对出现。否则可能编译不过去。

如下是threadprocess的一些原语:

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

阅读(938) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~