在应用程序编程中,为了不影响与用户交互的性能,通常需要创建新的线程来处理一些比较耗时的、
不影响用户体验的工作。而这又通常分为两种情况:
(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之学习篇的更多相关文章

  1. [linux time命令学习篇] time 统计命令执行的时间

    注意: 命令后面一定要有分号; http://codingstandards.iteye.com/blog/798788 用途说明 time命令常用于测量一个命令的运行时间,注意不是用来显示和修改系统 ...

  2. 鸟哥Linux私房菜基础学习篇学习笔记3

    鸟哥Linux私房菜基础学习篇学习笔记3 第十二章 正则表达式与文件格式化处理: 正则表达式(Regular Expression) 是通过一些特殊字符的排列,用以查找.删除.替换一行或多行文字字符: ...

  3. 鸟哥Linux私房菜基础学习篇学习笔记2

    鸟哥Linux私房菜基础学习篇学习笔记2 第九章 文件与文件系统的压缩打包: Linux下的扩展名没有什么特殊的意义,仅为了方便记忆. 压缩文件的扩展名一般为: *.tar, *.tar.gz, *. ...

  4. 鸟哥Linux私房菜基础学习篇学习笔记1

    鸟哥Linux私房菜基础学习篇学习笔记1 第三章 主导分区(MBR),当系统在开机的时候会主动去读取这个区块的内容,必须对硬盘进行分区,这样硬盘才能被有效地使用. 所谓的分区只是针对64Bytes的分 ...

  5. 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录

    目录 目录 前言 关于这本书 必看知识点 最后 前言 相信部分刚进入这个行业的新同学会对一个问题感到疑惑,为什么从培训学校出来的学员不被欢迎? 这里记录下一些我个人的看法(博主也曾有面试新员工的经历) ...

  6. Tomcat集群配置学习篇-----分布式应用

    Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...

  7. 20165205 预习作业三 Linux安装及学习

    Linux安装及学习 安装Ubuntu 1)安装版本 在安装VirtualBox时选择了VirtualBox 5.2.6 platform package 安装Ubuntu时选择了Ubuntu 16. ...

  8. 20165315 预备作业3 Linux安装及学习

    20165315 预备作业3 Linux安装及学习 一.在自己笔记本上安装Linux操作系统 因为对操作电脑的不熟悉,我在第一项任务上就花费了一定的时间,在安装过程有如下问题: 我的电脑是苹果公司的M ...

  9. Linux操作系统入门学习总结(2015.10)

    用了差不多45天的时间把Linux操作系统入门的资料学习了下.主要阅读了以下几本书: 鸟哥的私房菜:Linux基础学习篇(第三版) "Running Linux" <LINU ...

随机推荐

  1. iOS中NSString转换成HEX(十六进制)-NSData转换成int

    http://www.2cto.com/kf/201402/281501.html 1 2 3 4 5 6 NSString *str = @"0xff055008"; //先以1 ...

  2. char 与 varchar 不同,造成的麻烦

    就是因为他们的不同,造成我一小天的麻烦,就是取得不了正确的结果,后来经原同事提醒,终于找到了原因,但是还有点没看懂,所以又找了个网上的经验,贴进来,以备以后再查. --简单的存储过程 create p ...

  3. C/C++ 内存布局详解(经典)(很久前不知哪儿转载的)

    一个由C/C++编译的程序除了存放函数二进制代码的程序代码段(code段)外,数据占用的内存大致分为以下几个部分: 1.栈区(stack) 存放局部变量.函数参数.返回数据.返回地址等.系统自动分配释 ...

  4. linux查看端口和进程

    查看进程 ps -aux | grep appname 杀死进程 kill pid 查看端口: netstat -ap | grep 端口号 netstat -ap | grep 进程名字 lsof ...

  5. BZOJ AC 200题留念

    话说本来想200AC就把题目总结一下...但是我现在挺懒的..不想弄...以后再来吧.

  6. Android之ksoap2-android详解与调用天气预报Webservice完整实例

    Google为Android平台开发Web Service客户端提供了ksoap2-android项目,在这个网址下载开发包http://code.google.com/p/ksoap2-androi ...

  7. Qt核心剖析: moc

    前面我们说过,Qt 不是使用的“标准的” C++ 语言,而是对其进行了一定程度的“扩展”.这里我们从Qt新增加的关键字就可以看出来:signals.slots 或者 emit.所以有人会觉得 Qt 的 ...

  8. 配置Jenkins的slave节点的详细步骤适合windows等其他平台(转)

    @  新建一个slave节点在Jenkins服务器上 1,进入Jenkins的主界面,进入“Manage Jenkins” 页面: 2,点击如下图中的“Manage  Nodes”: 3,进入页面后点 ...

  9. boost库中thread多线程详解2——mutex与lock

    1. mutex对象类 mutex类主要有两种:独占式与共享式的互斥量.▲ 独占式互斥量:mutex: 独占式的互斥量,是最简单最常用的一种互斥量类型try_mutex: 它是mutex的同义词,为了 ...

  10. 王立平-- ContentValues , HashTable , HashMap差别

    ContentValues  :是一种存储机制,key-value 特点:key仅仅能是string类型.value:仅仅能是基本类型,不能是对象. 应用:经常使用语往数据库中插入数据 Content ...