Chinaunix首页 | 论坛 | 博客
  • 博客访问: 283569
  • 博文数量: 58
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-27 08:37
个人简介

从linux了解世界

文章分类
文章存档

2017年(5)

2016年(51)

2015年(2)

我的朋友

分类: C/C++

2016-07-30 14:13:09

同一进程下的不同线程共享数据段,linux下的多线程遵循posix线程借口,称为pthread。编写linux下的多线程程序,需要使用pthread.h的头文件,连接时使用libpthread.a库。

int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,(void*)(*start_rtn)(void*),void *arg);
tidp:线程id,不是用来输入id,而是用来获取id。
attr:线程属性,通常为null
start_rtn:线程要执行的函数,线程要执行的程序要写成一个函数
arg:start_rtn的参数,如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg的参数传入。
若线程创建成功,则返回0。若线程创建失败,则返回出错编号,返回成功时由tidp指向的内存单元被设置为新创建线程的线程ID。

线程中用exit整个进程都退出,线程正常的退出:return返回;使用pthread_exit函数;子线程可以通过pthread_exit传递一个返回值,而主线程通过pthread_join获得该返回值,从而判断该子线程的退出是正常还是异常。

void pthread_exit(void *retval);retval为返回值

int pthread_join(pthread_t thread, void **retval);retval为二级指针,阻塞直到制定线程终止。

pthread_t pthread_self(void);获取线程自身id。pthread_t的类型为unsigned long int,所以在打印的时候要使用%lu方式,否则显示结果出问题。也可以直接使用在pthread_create中的id,但是要注意事先声明。

从pthread_cleanup_push到pthread_cleanup_pop之间程序段的终止动作(包括调用pthread_exit和异常终止,不包括return)都将执行pthread_cleanup_push指定的清理函数。

void pthread_cleanup_push(void (*routine)(void *), void *arg);routine是清除函数,arg是清除函数的参数。

void pthread_cleanup_pop(int execute);运行到pop时还没有终止动作,时候在弹出清理函数的同时执行该函数,非0执行,0不执行。

重点:

http://www.cnblogs.com/gmh915/archive/2010/06/11/1756067.html 讲解函数指针和指针函数

函数指针:int (*func)();指针函数int *func();一个是指针变量一个是函数

void *无类型指针,任何类型的指针都可以付给无类型指针,反之不可以

在自己写程序中发现int和void*强制转换有警告,后来发现64位系统int为4B,long为8B,指针为8B。所以int和void*强制转换有警告。

在pthread_creat中把函数参数地址输入,在函数中把void*类型转换为之前参数的类型,不需要繁琐的反复进程void*的转换。

pthread_cleanup_push和pthread_cleanup_pop必须成对出现相当于{}。
阅读(1957) | 评论(0) | 转发(0) |
0

上一篇:linux c进程通信

下一篇:linux c网络编程

给主人留下些什么吧!~~