线程--线程创建与终止
2017-03-29 10:47
134 查看
创建线程:
返回值:成功返回0,失败返回错误号。
一般的系统函数都是成功返回0,失败返回-1,而错误号保存在全局变量errno中,而pthread库的函数都是通过返回值返回错误号,虽然每个线程也都有一个errno,但这是为了兼容其它函数接口而提供的,pthread库本身并不使用它,通过返回值返回错误码更加清晰。
pthread_create成功返回后,新创建的线程的id被填写到thread参数所指向的内存单元
在不同的系统中pthread_t这个类型有不同的实现,它可能是一个整数值,也可能是一个结构体,也可能是一个地址,所以不能简单地当成整数用printf打印,调用pthread_self()可以返回当前线程的id。
attr是线程属性。
Start_routine:用户线程函数指针,参数类型和返回类型都有用户定义。
arg:start_routine的参数。err=pthread_create();
fprintf(stderr,
"can't create thread: %s\n", strerror(err));
由于pthread_create的错误码不保存在errno中,因此不能直接用perror(3)打印错误信息,可以先用strerror(3)把错误码转换成错误信息再打印。任意一个线程调用了exit或_exit,则整个进程的所有线程都终止。线程终止:Posix的线程终止有两种情况:正常终止和非正常终止。正常终止:
1.从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit。
2.线程可以调用pthread_exit终止自己。
非正常终止:
3. 一个线程可以调用pthread_cancel终止同一进程中的另一个线程。
4. 或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。
需要注意,pthread_exit或者return返回的指针所指向的内存单元必须是全局的或者是用malloc分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。
一般情况下,进程中各个线程的运行都是相互独立的,线程的终止并不会通知,也不会影响其他线程,终止的线程所占用的资源也并不会随着线程的终止而得到释放。正如进程之间可以用wait()系统调用来同步终止并释放资源一样,线程之间也有类似机制,那就是pthread_join()函数。
thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下:
1.如果thread线程通过return返回,value_ptr所指向的单元里存放的是thread线程函数的返回值。
2.如果thread线程被别的线程调用pthread_cancel异常终止掉,value_ptr所指向的单元里存放的是常数PTHREAD_CANCELED。
3.如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。
如果对thread线程的终止状态不感兴趣,可以传NULL给value_ptr参数。不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源,就是一个必须考虑解决的问题。一个线程仅允许唯一的一个线程使用pthread_join()等待它的终止,并且被等待的线程应该处于可join状态,即非DETACHED状态。如果进程中的某个线程执行了pthread_detach(th),则th线程将处于DETACHED状态,这使得th线程在结束运行时自行释放所占用的内存资源,同时也无法由pthread_join()同步,pthread_detach()执行之后,对th请求pthread_join()将返回错误。一个可join的线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放,因此为了避免内存泄漏,所有线程的终止,要么已设为DETACHED,要么就需要使用pthread_join()来回收。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(859) | 评论(0) | 转发(0) |
0
上一篇:线程--线程的概念
下一篇:移植linux2.6.32.2到mini2440
相关热门文章
浅析usb转serial串口设备在lin...
文件系统存在的深层次的原因如...
Qt学习笔记---QNetworkAccessM...
Cisco VPP启动流程
Cisco VPP简介
Serv-u的ODBC数据库做法(完整...
10种启动故障解决方法(转)...
Auto CAD 2007中文版 迅雷免费...
MATLAB中plot的用法
出现“high definition audio...
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
#include int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg) |
一般的系统函数都是成功返回0,失败返回-1,而错误号保存在全局变量errno中,而pthread库的函数都是通过返回值返回错误号,虽然每个线程也都有一个errno,但这是为了兼容其它函数接口而提供的,pthread库本身并不使用它,通过返回值返回错误码更加清晰。
pthread_create成功返回后,新创建的线程的id被填写到thread参数所指向的内存单元
在不同的系统中pthread_t这个类型有不同的实现,它可能是一个整数值,也可能是一个结构体,也可能是一个地址,所以不能简单地当成整数用printf打印,调用pthread_self()可以返回当前线程的id。
attr是线程属性。
Start_routine:用户线程函数指针,参数类型和返回类型都有用户定义。
arg:start_routine的参数。err=pthread_create();
fprintf(stderr,
"can't create thread: %s\n", strerror(err));
由于pthread_create的错误码不保存在errno中,因此不能直接用perror(3)打印错误信息,可以先用strerror(3)把错误码转换成错误信息再打印。任意一个线程调用了exit或_exit,则整个进程的所有线程都终止。线程终止:Posix的线程终止有两种情况:正常终止和非正常终止。正常终止:
1.从线程函数return。这种方法对主线程不适用,从main函数return相当于调用exit。
2.线程可以调用pthread_exit终止自己。
非正常终止:
3. 一个线程可以调用pthread_cancel终止同一进程中的另一个线程。
4. 或者由于自身运行出错(比如访问非法地址)而退出,这种退出方式是不可预见的。
#include void pthread_exit(void *value_ptr); void pthread_cancel(pthread_t tid); |
#include int pthread_join(pthread_t thread, void **value_ptr); int pthread_detach(pthread_t tid); |
thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下:
1.如果thread线程通过return返回,value_ptr所指向的单元里存放的是thread线程函数的返回值。
2.如果thread线程被别的线程调用pthread_cancel异常终止掉,value_ptr所指向的单元里存放的是常数PTHREAD_CANCELED。
3.如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。
如果对thread线程的终止状态不感兴趣,可以传NULL给value_ptr参数。不论是可预见的线程终止还是异常终止,都会存在资源释放的问题,在不考虑因运行出错而退出的前提下,如何保证线程终止时能顺利的释放掉自己所占用的资源,特别是锁资源,就是一个必须考虑解决的问题。一个线程仅允许唯一的一个线程使用pthread_join()等待它的终止,并且被等待的线程应该处于可join状态,即非DETACHED状态。如果进程中的某个线程执行了pthread_detach(th),则th线程将处于DETACHED状态,这使得th线程在结束运行时自行释放所占用的内存资源,同时也无法由pthread_join()同步,pthread_detach()执行之后,对th请求pthread_join()将返回错误。一个可join的线程所占用的内存仅当有线程对其执行了pthread_join()后才会释放,因此为了避免内存泄漏,所有线程的终止,要么已设为DETACHED,要么就需要使用pthread_join()来回收。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(859) | 评论(0) | 转发(0) |
0
上一篇:线程--线程的概念
下一篇:移植linux2.6.32.2到mini2440
相关热门文章
浅析usb转serial串口设备在lin...
文件系统存在的深层次的原因如...
Qt学习笔记---QNetworkAccessM...
Cisco VPP启动流程
Cisco VPP简介
Serv-u的ODBC数据库做法(完整...
10种启动故障解决方法(转)...
Auto CAD 2007中文版 迅雷免费...
MATLAB中plot的用法
出现“high definition audio...
linux dhcp peizhi roc
关于Unix文件的软链接
求教这个命令什么意思,我是新...
sed -e "/grep/d" 是什么意思...
谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
相关文章推荐
- 【转帖】在内核模式下创建和终止线程
- 如何:创建和终止线程(C# 编程指南--MSDN)
- 多线程编程-线程的创建和终止
- Linux 线程(创建/等待/终止)
- Windows线程的创建和终止
- 【转】C# 创建 终止线程
- 如何:创建和终止线程(C# 编程指南)
- 多线程编程-线程的创建和终止
- 多线程编程-线程的创建和终止
- linux基础编程:多线程基础总结:线程创建 终止 线程同步/互斥量/条件变量/信号灯
- 创建和终止线程的好方法
- asp.net 创建和终止线程(多线程)
- 如何创建和终止线程(转载自MSDN)
- 如何:创建和终止线程(C# 编程指南)
- 转帖】在内核模式下创建和终止线程 收藏
- .NET多线程技术详解(2) 创建、终止线程
- 在内核模式下创建和终止线程
- 多线程编程-线程的创建和终止
- pthread线程的终止退出 | 线程的大量创建
- 线程的创建与终止