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 ...
随机推荐
- Python基础1:一些小知识汇总
一.#!usr/bin/env python 脚本语言的第一行,指定执行脚本的解释器. #!/usr/bin/python 是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器 ...
- 基于visual Studio2013解决C语言竞赛题之0502最小数替换
题目
- C#操作Excel(读/写)
http://www.cnblogs.com/litianfei/archive/2008/03/21/1116906.html 写的很详细 一.操作Excel 首先导出Excel (1)示例: // ...
- Android新增API之AudioEffect中文API与应用实例
在Android2.3中增加了对音频混响的支持,这些API包含在android.media.audiofx包中. 一.概述 AudioEffect是android audio framework(an ...
- libevent: linux安装libevent
http://libevent.org/上下载最新的libevent, 如 libevent-2.0.22-stable.tar.gz. 然后解压,按照README里面的步骤安装.
- java项目打jar包的两种情况
链接地址:http://jingyan.baidu.com/article/6b97984d8a6ddc1ca2b0bfa0.html 本文介绍一下java项目打jar包时的两种情况各怎么操作 方 ...
- BZOJ AC 200题留念
话说本来想200AC就把题目总结一下...但是我现在挺懒的..不想弄...以后再来吧.
- 基于visual Studio2013解决C语言竞赛题之1005整理队形
题目 解决代码及点评 /************************************************************************/ ...
- MinGW开发工具的安装
MinGW是Minimalist GNU for Windows的缩写,是把linux下的GNU开发工具包移植到windows的项目之一.和Cygwin不一样的是,MinGW不提供linux的posi ...
- Eclipse用法和技巧二十三:查看JDK源码
使用java开发,如果能阅读JDK的经典代码,对自己的水平提高是很有帮助的.笔者在实际工作中总结了两种阅读JDK源码的方式.第一种下载android源代码,直接在android源码代码中,这里的代码虽 ...