POSIX多线程--线程基本操作接口
2015-08-29 15:30
323 查看
与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的
链接这些线程函数库时要使用编译器命令的”-lpthread“选项
int pthread_create(pthread_t thread, const pthread_attr_t *attr, void (start_routine)(void), void *arg);
功能:创建一个新的线程
参数:
thread:返回线程ID
attr:设置线程的属性,attr为NULL表示使用默认属性
start_routine:是函数地址,线程启动后要执行的函数(所指向的函数要接受一个无类型(void)参数,函数返回值类型也为无类型)
arg:传递给线程启动函数的参数
返回值:成功返回0;失败返回错误码
错误检测
通常处理方法:
if((ret = pthread_create(&tid, NULL, thread_routine, NULL))){
fprintf(stderr, “pthread_create:%s\n”, strerror(ret));
}
int pthread_join(pthread_t thread, void ** retval);
功能:以阻塞方式等待一个thread指定的线程结束。当函数返回时,被等待线程的资源别收回。
参数:thread:线程标识符
retval:用户定义的指针,用来存储被等待线程的返回值。
返回值:0表示成功。失败,返回错误号。
int pthread_exit(void *value_ptr);
功能:线程终止
参数:
value_ptr:
返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)
int pthread_cancel(pthread_t thread);
功能:取消一个执行中的进程 – 一个进程可以杀死另外一个线程
参数:thread:线程ID
返回值:成功返回0;失败返回错误码
pthread_t pthread_self(void);
功能:返回当前线程ID
返回值:成功返回0
int pthread_detach(pthread_t thread);
功能:讲一个线程分离
参数:thread:线程ID
返回值:成功返回0;失败返回错误码
例:pthread_detach(pthread_self());//将当前线程设置为分离状态–避免僵线程产生
进程和线程的对比
线程
进程
为什么用多线程?
1
多线程相对于进程相比,它是一种非常“节俭”的多任务操作方式。在linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护他的代码段,数据段和堆栈段。而运行一个进程中的多个线程,它们彼此使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程。
2
多线程间方便的通信机制。对不同进程来说,它们有独立的数据空间,要进行数据的传递只能通过通信的方式进行。线程则不然,由于同一线程下的线程之间共享数据空间,所以一个线程的数据空有直接别其他线程所使用。
链接这些线程函数库时要使用编译器命令的”-lpthread“选项
int pthread_create(pthread_t thread, const pthread_attr_t *attr, void (start_routine)(void), void *arg);
功能:创建一个新的线程
参数:
thread:返回线程ID
attr:设置线程的属性,attr为NULL表示使用默认属性
start_routine:是函数地址,线程启动后要执行的函数(所指向的函数要接受一个无类型(void)参数,函数返回值类型也为无类型)
arg:传递给线程启动函数的参数
返回值:成功返回0;失败返回错误码
错误检测
* 传统的一些函数是,成功返回0,失败返回-1,并且对全局变量errno赋值以指示错误 * pthreads函数出错时不会设置全局变量errno,而是将错误代码通过返回值返回 * pthreads统一也提供线程内的errno变量,以支持其他使用errno的代码。对于pthreads函数的错误,建议通过返回值判定,因为读取返回值要比读取线程内的errno变量开销更小
通常处理方法:
if((ret = pthread_create(&tid, NULL, thread_routine, NULL))){
fprintf(stderr, “pthread_create:%s\n”, strerror(ret));
}
int pthread_join(pthread_t thread, void ** retval);
功能:以阻塞方式等待一个thread指定的线程结束。当函数返回时,被等待线程的资源别收回。
参数:thread:线程标识符
retval:用户定义的指针,用来存储被等待线程的返回值。
返回值:0表示成功。失败,返回错误号。
int pthread_exit(void *value_ptr);
功能:线程终止
参数:
value_ptr:
返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)
int pthread_cancel(pthread_t thread);
功能:取消一个执行中的进程 – 一个进程可以杀死另外一个线程
参数:thread:线程ID
返回值:成功返回0;失败返回错误码
pthread_t pthread_self(void);
功能:返回当前线程ID
返回值:成功返回0
int pthread_detach(pthread_t thread);
功能:讲一个线程分离
参数:thread:线程ID
返回值:成功返回0;失败返回错误码
例:pthread_detach(pthread_self());//将当前线程设置为分离状态–避免僵线程产生
进程和线程的对比
线程
* 进程里执行代码的部分; * 包含一系列机器指令所必须的机器状态,包括当前指令位置(一般为PC寄存器)、栈顶指针SP、通用寄存器、地址和数据寄存器等。 * 线程不包括进程中的其他数据,如地址空间和文件描述符;
进程
* 线程加上地址空间、文件描述符和其他数据。 * 一个进程中的所有线程共享文件和地址空间,包括程序段、数据段和堆栈;
为什么用多线程?
1
多线程相对于进程相比,它是一种非常“节俭”的多任务操作方式。在linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护他的代码段,数据段和堆栈段。而运行一个进程中的多个线程,它们彼此使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程。
2
多线程间方便的通信机制。对不同进程来说,它们有独立的数据空间,要进行数据的传递只能通过通信的方式进行。线程则不然,由于同一线程下的线程之间共享数据空间,所以一个线程的数据空有直接别其他线程所使用。
相关文章推荐
- ios引入zxing二维码识别子工程遇到的问题
- wampserver2.5的php.ini位置在wamp\bin\apache\apache2.4.9\bin
- 热插拔新特性cdb/pdb
- LAMP初次搭建
- 深入理解ThreadLocal
- 黑马程序员--Java_IO流(二)
- UINavigationController及界面传值
- Java中的内部类
- squeeze()
- MySQL基本操作(二)
- centos+bond+bridge+docker(ssh容器)固定ip实现测试环境(二)
- ip_queue内核通信
- 整合spark和hive
- 对象的简单内存分析
- mysql的查询、子查询及连接查询
- oc带顺序连算不带优先级计算器(作为备忘,完成度:95%)
- 洗脑的胃口
- poj 3661 dp(Running)
- [Cocoa]_[初级]_[使用NSXMLElement 创建一个XML文件]
- delpi2007 in x64 os(win7/8), 经常出现bordbk105N.dll错误