linux pthread之学习篇
在应用程序编程中,为了不影响与用户交互的性能,通常需要创建新的线程来处理一些比较耗时的、
不影响用户体验的工作。而这又通常分为两种情况:
(1)需要临时创建一个线程来做某件特定的事,等事情做完时线程即可销毁;
(2)需要创建一个固定的线程一直监控某件事的发生。
pthread是一个遵守POSIX标准的线程库,我们可以使用pthread来轻松的完成我们的需求。
虽然pthread是遵守POSIX标准的库,但它却不是linux的默认库,所以如果要使用pthread,
必须要link libpthread.a才可以。
如果你要临时的创建一个线程去做一件事,代码示例之一:
#include <pthread.h>
void* _pthread_do_something(void* arg)
{
pthread_detach(pthread_self());
do_something();
return null;
}
int main()
{
pthread_t pthread = 0;
pthread_create(&pthread, null, _pthrad_do_something, arg);
exit(1);
}
pthread有joinable和unjoinable两种状态,默认情况下在pthread create时会预设为joinable状态,
如果是joinable状态的线程,那么在线程退出时即使调用了pthread_exit也也不会释放线程所占用的
堆栈和线程描述符,从而就会造成线程资源泄漏。
有三种方法可以将线程设置为unjoinable状态:
(1) 用户在pthread create创建线程时指定线程为unjoinable状态;
(2) 在线程创建后,在线程函数中调用pthread_detach(pthread_self())将自己置为unjoinable状态,
如上面示例一所示;
(3) 在主线程中调用pthread_join,这样主线程会等到新创建线程的结束才会结束。
代码示例之二:
#include <pthread.h>
void* _pthread_do_something(void* arg)
{
do_something();
pthread_exit();
return null;
}
int main()
{
pthread_t pthread = 0;
pthread_create(&pthread, null, _pthrad_do_something, arg);
pthread_join(pthread, null);
exit(1);
}
如果你的线程要一直用来监控某件事是否发生,那就不要退出线程了,看代码示例之三:
#include <pthread.h>
void* _pthread_do_something(void* arg)
{
while(1)
{
do_something();
}
pthread_exit();
return null;
}
int main()
{
pthread_t pthread = 0;
pthread_create(&pthread, null, _pthrad_do_something, arg);
pthread_join(pthread, null);
exit(1);
}
目前本人对pthread的理解还比较肤浅,后面有更深刻的心得体会时会再分享出来。
欢迎大家一起讨论和交流。
linux pthread之学习篇的更多相关文章
- [linux time命令学习篇] time 统计命令执行的时间
注意: 命令后面一定要有分号; http://codingstandards.iteye.com/blog/798788 用途说明 time命令常用于测量一个命令的运行时间,注意不是用来显示和修改系统 ...
- 鸟哥Linux私房菜基础学习篇学习笔记3
鸟哥Linux私房菜基础学习篇学习笔记3 第十二章 正则表达式与文件格式化处理: 正则表达式(Regular Expression) 是通过一些特殊字符的排列,用以查找.删除.替换一行或多行文字字符: ...
- 鸟哥Linux私房菜基础学习篇学习笔记2
鸟哥Linux私房菜基础学习篇学习笔记2 第九章 文件与文件系统的压缩打包: Linux下的扩展名没有什么特殊的意义,仅为了方便记忆. 压缩文件的扩展名一般为: *.tar, *.tar.gz, *. ...
- 鸟哥Linux私房菜基础学习篇学习笔记1
鸟哥Linux私房菜基础学习篇学习笔记1 第三章 主导分区(MBR),当系统在开机的时候会主动去读取这个区块的内容,必须对硬盘进行分区,这样硬盘才能被有效地使用. 所谓的分区只是针对64Bytes的分 ...
- 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录
目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...
- Tomcat集群配置学习篇-----分布式应用
Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...
- 20165205 预习作业三 Linux安装及学习
Linux安装及学习 安装Ubuntu 1)安装版本 在安装VirtualBox时选择了VirtualBox 5.2.6 platform package 安装Ubuntu时选择了Ubuntu 16. ...
- 20165315 预备作业3 Linux安装及学习
20165315 预备作业3 Linux安装及学习 一.在自己笔记本上安装Linux操作系统 因为对操作电脑的不熟悉,我在第一项任务上就花费了一定的时间,在安装过程有如下问题: 我的电脑是苹果公司的M ...
- Linux操作系统入门学习总结(2015.10)
用了差不多45天的时间把Linux操作系统入门的资料学习了下.主要阅读了以下几本书: 鸟哥的私房菜:Linux基础学习篇(第三版) "Running Linux" <LINU ...
随机推荐
- x64栈结构
A function's prolog is responsible for allocating stack space for local variables, saved registers, ...
- windows服务怎么向应用程序发消息(部署在同一台机,非SCOKET)
命名管道:NamedPipeClientStream & NamedPipeClientStream 参考实例:http://msdn.microsoft.com/zh-cn/library/ ...
- 基于visual Studio2013解决C语言竞赛题之0521圆盘求和
题目
- 快速解决PDF文档加密不能打印问题_百度经验
快速解决PDF文档加密不能打印问题_百度经验 快速解决PDF文档加密不能打印问题 | 浏览:182 | 更新:2014-01-06 1 ...
- Adobe Acrobat Ⅺ Pro安装激活
1.注意一定要断网安装,如果你有防火墙拦截亦可(注意:系统自带那防火墙不行). 2.将AcrobatPro_11_Web_WWMUI.exe解压到一个目录下,找到目录下的setup.exe安装,安装时 ...
- GCD基本使用
主要概念 队列 dispatch_queue_t,队列名称在调试时辅助,无论什么队列和任务,线程的创建和回收不需要程序员操作,有队列负责. 串行队列:队列中的任务只会顺序执行(类似跑步) dispat ...
- JRE 和 JDK 的区别是什么?
JRE: Java Runtime Environment JDK:Java Development Kit JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库.是使用java ...
- 在开发 ExtJS 应用程序常犯的 10 个错误
这是 CNX 公司在开发 ExtJS 项目中总结的需要特别注意的 10 个地方.有时候,我们完全是自己使用 ExtJS 从零开始构建的新的应用程序,但有时候我们的客户会要求我们使用他们自己的代码,并且 ...
- 理解js的prototype原型对象
我们创建的每一个函数都有一个prototype(原型)属性.这个属性是一个指针,指向一个对象,而这个对象的用途是包括能够由特定类型的全部实例共享的属性和方法.假设依照字面意思来理解,那么prototy ...
- poll调用深入解析
poll调用深入解析http://blog.csdn.net/zmxiangde_88/article/details/8099049 poll调用和select调用实现的功能一样,都是网络IO利用的 ...