linux线程笔记1

2017-01-05 11:38:38来源:CSDN作者:lu_k120人点击

线程创建

#include <pthread.h>
int pthread_create(pthread_t *restrict tidp,const pthread_attr_t *restrict attr, 
void *(*start_rtn)(void*) ,void *restrict arg);
参数: tidp : 线程标识符指针
        attr :  线程属性指针
start_rtn : 线程运行函数的起始地址
arg : 传递给线程运行函数的参数

2.等待线程

                int pthread_join(pthread_t th,void **thread_return);
功能:主线程等待子线程结束并得到返回值
参数: th:被等待线程的标识符
thread_return :用户定义指针,用来存储被等待线程的返回值

3.线程终止

主动终止:

1.线程的执行函数中调用return语句

  return (void *)0;

2.调用pthread_exit()

void pthread_exit(void *retval);
功能:线程退出时使用函数pthread_exit,是线程的主动行为
参数:retval:调用者线程 的返回值,可由其他函数和pthread_join来检测获取

被动终止:

线程可以被同一进程的其他线程取消,其他线程调用
int pthread_cancel(pthread_t thid);
功能:线程可以被同一进程的其他线程取消
参数:tid:被终止的线程标识符

4.线程清理和控制函数

#include <pthread.h>
void pthread_cleanup_push(void (*rtn)(void *),void *arg);
void pthread_cleanup_pop(int excute);
参数:
rtn:清理函数指针
arg:调用清理函数传递的参数
excute:值1时执行线程清理函数,值0时不执行线程清理函数
触发线程调用清理函数的动作
1.调用pthread_exit
2.响应取消请求
3.用非零excute参数调用thread_cleanup_pop时
例子:
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
//定义线程清理函数
void clean_fun(void *arg)
{
char *s = (char *)arg;
printf("clean_func:%s/n",s);
}
void *th_fun(void *arg)
{
int excute = (int)arg;
pthread_cleanup_push(clean_fun,"first clean func");
pthread_cleanup_push(clean_fun,"second clean func");
printf("thread running %lx/n",pthread_self());
pthread_cleanup_pop(excute);
pthread_cleanup_pop(excute);
return (void *)0;
}
int main(void)
{
int err;
pthread_t th1,th2;
if((err = pthread_create(&th1,NULL,th_fun,(void*)1)) != 0){
perror("pthread create error");
}
pthread_join(th1,NULL);
printf("th1(%lx) funished/n",th1);

if((err = pthread_create(&th2,NULL,th_fun,(void*)1)) != 0){
perror("pthread create error");
}
pthread_join(th2,NULL);
printf("th2(%lx) funished/n",th2);

return 0;
}

5.线程属性初始化和销毁

#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr)
int pthread_attr_destory(pthread_attr_t *attr)
返回值:成功返回0,否则返回错误编号
线程属性结构:
typedef struct
{
intetachstate;//线程的分离状态
intschedpolicy;//线程的调度策略
structsched_paramschedparam;//线程的调度参数
intinheritsched;//线程的继承性
intscope;//线程的作用域
size_tquardsize;//线程栈末尾的警戒缓冲区大小
intstackaddr_set;//线程的栈设置
void*stackaddr;//线程栈的位置
size_tstacksize;//线程栈的大小
}pthread_attr_t;

6.设置和获得分离属性

以默认方式启动的线程,在线程结束后不会自动释放占有的系统资源,要在主控线程中调用pthread_join()后才会释放
以分离状态启动的线程,在线程结束后会自动释放所占有的系统资源。

分离属性在网络通讯中使用的较多
#include <pthread.h>
int pthread_attr_getdetachstat(const pthread_attr_t *restrict attr,int *dedachstate);
int pthread_attr_setdetachstat(const pthread_attr_t *restrict attr,int *dedachstate);
返回值:成功返回0,出错返回错误编号
参数:detachstate:PTHREAD_CREATE_JOINABLE(默认值)正常启动线程
              PTHREAD_CREATE_DETACHED以分离状态启动线程
例子:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
void out_state(pthread_attr_t *attr)
{
int state;
if(pthread_attr_getdetachstate(attr,&state) != 0){
perror("getdetachstate error");
}else{
if(state == PTHREAD_CREATE_JOINABLE){
printf("joinable state/n");
}else{
printf("detached state/n");
}else{
printf("error state/n");
}
}
}
void *th_fn(void *arg)
{
int i,sum;
for(i = 1;i <=100;i++)
sum += i;
return (void*)sum;
}
int main(void)
{
int err;
pthread_t default_th,detach_th;
//定义线程属性
pthread_attr_t attr;
//对线程属性初始化
pthread_attr_init(&attr);
//输出分离属性
out_state(&attr);


//取分离属性的默认值。以正常方式启动子线程
if((err = pthread_create(&default_th,&attr,th_fn,(void*)0)) != 0)
{
perror("pthread create error");
}
int err;
if((err = pthread_join(default_th,(void *)res)) != 0){
perror("pthread join error");
}else{
printf("defalut return is %d/n",(int)res);
}
//设置分离属性为分离状态
pthread_attr_setdetachstate(&attr,PTHREAD+CREATE_DETACHED);
//输出分离属性
out_state(&attr);
//以分离状态启动子线程
if((err = pthread_create(&detach_th,&attr,th_fn,(void*)0)) != 0)
{
perror("pthread create error");
}

//销毁线程属性
pthread_attr_destroy(&attr);
printf("0x%lx finshed/n",pthread_self());
}

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台