- 论坛徽章:
- 0
|
linux中的多线程使用了libpthread.a,因为在编译的时候需要加入该库-lpthread。多线程跟多进程不一样,线程是基于进程而存在的,线程之间共享了进程的数据,因为在使用多线程时,需要放置对共享数据的破坏。
linux多线程pthread的函数声明在中,因此在使用该函数时,需要把该头文件引入。
线程的创建
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
请求控制流的非正常退出
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/101537/showart_2004246.html |
|