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

原文地址:https://www.cnblogs.com/riskyer/p/3315328.html