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 ...
随机推荐
- 在线QQ客服
代码一: <a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=451314789&si ...
- 平衡二叉树算法实现 c语言版 插入 删除
#include <stdio.h>#include <malloc.h>#include<stdlib.h> #define EQ(a,b) ((a)==(b)) ...
- Verilog实现IIC通讯第二版
HMC5883三轴磁力传感器IIC通讯模块的VerilogHDL的实现 上一版并没有实现我想要的功能 0.0.1版 正在修订中 2013/9/2 //date :2013/7/7 //desi ...
- android的animator
3.0 以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,这 ...
- 2015.7.17( NOI2015 day1 )
今天早起做了NOI2015网络同步赛.... 最近NOI是越来越向NOIP靠拢了....但是我还是不会做..... 第一题:程序自动分析 先离散化一下..然后最多就剩20w个数 , 不等于就存起来.. ...
- awk 的逻辑运算字符
既然有需要用到 "条件" 的类别,自然就需要一些逻辑运算啰-例如底下这些:运算单元代表意义> 大于小于>= 大于或等于小于或等于== 等于!= 不等于值得注意的是那个 ...
- 安装MyEclipse Color Themes
下载地址:http://eclipsecolorthemes.org/?list=toppicks&lang=html 安装步骤如下: 1.Import---Preferences 2.选择下 ...
- 高级UIKit-03(NSFileManager、NSFileHandle)
fileManager文件管理器 [day04_1_FileManager_Search] :查找文件 fileManager有一个方法可以判断文件是否是文件夹, fileExistsAtPath:i ...
- splinter python浏览器自动化操作,模拟浏览器的行为
Splinter可以非常棒的模拟浏览器的行为,Splinter提供了丰富的API,可以获取页面的信息判断当前的行为所产生的结果 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有 ...
- 道可叨 | Python 标准库 urllib2 的使用细节
道可叨 | Python 标准库 urllib2 的使用细节 request = urllib2.Request(uri) request.add_header('User-Agent', 'fake ...