linux多线程pthread
时间:2009-07-23 来源:mycareer
1、创建
int pthread_create( pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(* func) (void *), void *restrict arg );
attr: 线程属性包括:优先级、初始栈大小,是否应该成为一个守护线程。
缺省设置,NULL
tidp是要创建的线程,创建成功后tipd为先线程的id
void *(* func) (void *)是一个函数指针,该函数指针的类型为void* (*)(void *)
是一个参数为void *,返回值也为void *的函数类型。它的一个简单的例子如下
void *thread_handler(void *arg)
{
return NULL;
}
void *restrict arg中的arg是void *(* func) (void *)函数指针的参数。
补充:函数声明中多次出现了restrict,其实这是用于CPU对函数的优化使用的,restrict的使用,由程序员保证使用restrict标志的参数间不会有内存重叠。
获取线程自身的id
pthread_t pthread_self(void);
等待给定线程终止
int pthread_join( pthread_t tid, void **status);
statues返回等待线程的返回值
单个线程有三种退出方式
1.线程从启动例程中返回(return方式),返回值是现成的退出码
2.线程被同一进程内的其他线程取消
3.线程调用pthread_exit退出。void pthread_exit(void *rval_ptr)
线程清理处理程序
void pthread_clean_push(void (*rtn)(void *),void *arg)
void pthread_clean_pop(iny excute)
清理函数rtn的调用顺序是由pthread_clean_push函数安排的。
它在下列几种情况下执行:
1.调用pthread_exit时
2.响应取消请求时
3.用非零execute参数调用pthread_clean_pop时
如果execute参数为0,清理函数将不被调用。无论何种情况,pthread_clean_pop都将删除上次pthread_clean_push建立的清理处理程序。
如果线程使用return从例程返回,那么pthread_clean_push建立的清理处理程序不会被执行。
linux thread与fork的对比
进程原语 | 线程原语 | 描述 |
fork | pthread_create | 创建新的控制流 |
exit | pthread_exit | 从现有的控制流退出 |
waitpid | pthread_join | 从控制流中得到退出状态 |
atexit | pthread_clean_push | 注册在退出控制流时执行的函数 |
getpid | pthread_self | 获得控制流ID |
abort | pthread_cancel | 请求控制流的非正常退出 |