zoukankan      html  css  js  c++  java
  • 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的理解还比较肤浅,后面有更深刻的心得体会时会再分享出来。
    欢迎大家一起讨论和交流。

  • 相关阅读:
    VS2010 修改模板文件,增加默认注释
    Substring方法(C#,JS,Java,SQL)的区别
    好的架构是进化来的,不是设计来的
    SQL Server编程系列(2):SMO常用对象的有关操作
    (转) SQL Server编程系列(1):SMO介绍
    SQL Server的分页优化及Row_Number()分页存在的问题
    CTE(Common Table Expression) 公用表表达式
    SSH加密原理、RSA非对称加密算法学习与理解
    asp.net 项目目录说明
    【转】SOA架构设计经验分享—架构、职责、数据一致性
  • 原文地址:https://www.cnblogs.com/riskyer/p/3315328.html
Copyright © 2011-2022 走看看