linux线程篇 (二) 线程的基本操作

  线程 进程
标识符 pthread_t pid_t
获取ID pthread_self() getpid()
创建 pthread_create() fork
销毁 pthread_exit() exit()
等待  pthread_join() wait()
 取消 pthread_cancel()  
信号发送 pthread_kill() kill() raise() alarm()
信号处理 signal signal
信号屏蔽 pthread_sigmask()  
线程清除 pthread_cleanup_push/pop  

1.线程的创建

#include <pthread.h>

pthread_t pthread_self(void);    //返回自己的线程id

int pthread_create(pthread_t *thread,
                   const pthread_attr_t *attr,
                   void *(*start_routine) (void *), 
                   void *arg);

//pthread_t *thread 新线程的id指针,注意是指针, pthread_t ntid; 这里就是 &tid
//const pthread_attr_t *attr, 新线程属性,这里暂为NULL
//void *(*start_routine) (void *),  新线程的函数入口
    /*
     *  描述:这是一个函数指针作为入口函数
     *    参数:void * 指针类型
     *  返回值为 void*
     *  (*start_routine) 这是一个指针变量,它指向一个函数,
             因此在实参里本应该是&thread_fun
             但是因为 函数名编译后,本身就是指针,所以可以隐去&
    */

    //实例:pthread_creat(&ntid,NULL,&thread_fun,"我是给thread_fun的参数");
    // void *thread_fun(void *arg){}

void pthread_exit(void *value_ptr);

2.线程的终止

单个线程的安全退出 (3)
(1) 从启动线程中返回,返回值时线程的退出码
(2) 线程可以被同一进程中的其他线程取消
(3) 线程调用pthread_exit(void *rval),rval 是退出码

void pthread_exit(void *value_ptr);

3.线程的链接

#include <pthread.h>

int pthread_join(pthread_t thread, void **value_ptr);
//该函数的线程会一直阻塞,直到 第一个参数的线程退出后,继续运行,第一个参数的线程退出码会被保存到第二个参数里,
//return 成功0 失败错误吗


//调用pthread_join 会让指定的线程处于分离状态,如果该线程已经是分离状态,那就会调用失败。

//
int  pthread_detach(pthread_t thread); //线程分离,可以分离自己

4.线程取消

//取消线程
int pthread_cancel(pthread_t thread);

​//取消状态
int pthread_setcancelstate(int state, int *oldstate);  
     //PTHREAD_CANCEL_ENABLE 允许取消   
     //PTHREAD_CANCEL_DISABLE 不允许取消​ 

//取消类型 
int pthread_setcanceltype(int type, int *oldtype);        
    //PTHREAD_CANCEL_DEFERRED 延迟取消        
    //PTHREAD_CANCEL_ASYNCHRONOUS 立即取消
//取消点 如果是延时取消,那么在每一个取消点都会检查是否取消            

5.线程信号

//1.信号的发送
int pthread_kill(pthread_t thread, int sig);    //向线程发送信号

//return
// [ESRCH]            thread is an invalid thread ID.
// [EINVAL]           sig is an invalid or unsupported signal number.
//[ENOTSUP]          thread was not created by pthread_create() and does not support being killed with
                        pthread_kill()

//信号的大部分操作是终止进程,所以要对信号作出正确的处理。
//2.信号的处理
int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);

     struct  sigaction {
             union __sigaction_u __sigaction_u;  /* signal handler */
             sigset_t sa_mask;               /* signal mask to apply */
             int     sa_flags;               /* see signal options below */
     };

     union __sigaction_u {
             void    (*__sa_handler)(int);
             void    (*__sa_sigaction)(int, siginfo_t *,
                            void *);
     };
//3.信号的屏蔽
int pthread_sigmask(int how, const sigset_t * restrict set, sigset_t * restrict oset);

6.进程的清除

//线程可以注册多个清理程序,入栈的形式 ,所以执行顺序和注册顺序相反

//注册清理程序
void pthread_cleanup_push(void (*cleanup_routine)(void *), void *arg);

//销毁清理程序
void pthread_cleanup_pop(int execute);


//响应方式
//1.pthreat_exit
//2.pthread_cancel
//3.调用 void pthread_cleanup_pop(int execute); 非零参数