linux 线程 原语套装

来源:互联网 发布:python数据类型 real 编辑:程序博客网 时间:2024/04/27 14:16

1>创建线程


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


pthread_t  线程id结构  (不一定是一个整数  有可能是地址之类的)只保证在本进程中是唯一的值

pthread_attr_t   线程属性结构

void *(*start_routine) (void *)函数指针类型这个函数返回一个void*指针  有一个void *参数



thread :作为返回值接收  创建的新的进程ID

attr:进程属性  若设置为NULL  则使用默认属性

start_routine:线程的函数起始地址

arg:传递给新创建线程的参数  如果想传递多个参数可以使用使用结构体


返回值  成功返回0   失败返回错误码  错误码可以用strerror函数打印错误码对应的情况

因为perror使用errno所以是一个不可重入函数  所以使用返回值不会导致出错


线程创建并不能保证那个线程先运行:调用进程  还是创建的进程


2>获取线程id

pthread_self()//返回调用线程的线程id

如果创建线程时先运行的是新线程   那么thread指向的空间可能还不是线程id  也就是说与pthread_self返回的值不同


3>线程终止

**从主线程中return  那么所有的线程都会终止(相当于exit   其他的线程return 相当于pthread_exit    主线程pthread_exit  只会导致自己退出  而不影响其他线程

**调用exit  _Exit  _exit使整个进程终止那么所有的线程终止


非控制线程的终止

**简单的return  返回的值就是退出码

**调用void pthread_exit(void *retval)

//void *retval:线程退出时传递出的参数,可以是退出值或地址,如是地址时,不能是线程内部申请的局部地址

**被其他线程终止


4>回收线程并获取线程的退出码

int pthread_join(pthread_t thread, void **retval);

pthread_t thread:回收线程的tid
void **retval:接收退出线程传递出的返回值  如果对线程的返回值不感兴趣那么 retval设置成NULL
返回值:成功返回0,失败返回错误码


调用该函数的线程将挂起等待,直到id为thread的线程终止。

thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下:


如果thread线程通过return返回,retval所指向的单元里存放的是thread线程函数的返
回值。
如果thread线程被别的线程调用pthread_cancel异常终止掉,retval所指向的单元里存
放的是常数PTHREAD_CANCELED。
如果thread线程是自己调用pthread_exit终止的,retval所指向的单元存放的是传给
pthread_exit的参数。


这个函数还可以将线程设置成分离态(留在下一篇讨论)


5>pthread_cancel

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

线程之间是可以相互取消的;并且可以取消主线程

被取消的线程,退出值,定义在Linux的pthread库中常数PTHREAD_CANCELED。


调用这个函数后线程并不一定终止

      同一进程的线程间,pthread_cancel向另一线程发终止信号。系统并不会马上关闭被取消线程,只有在被取消线程
下次系统调用时,才会真正结束线程。或调用pthread_testcancel,让内核去检测是否需要取消当前线程

系统调用会陷入内核那么线程



6>int pthread_equal(pthread_t t1, pthread_t t2);  //比较两个线程值是否相等

因为不确定pthread_t的类型所以我们需要这个函数不能直接 ==


7>分离线程


#include <pthread.h>
int pthread_detach(pthread_t tid);
pthread_t tid:分离线程tid
返回值:成功返回0,失败返回错误号。


一般情况下,线程终止后,其终止状态一直保留到其它线程调用pthread_join获取
它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收
它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用
pthread_join,这样的调用将返回EINVAL。如果已经对一个线程调用了pthread_detach就不
能再调用pthread_join了。




0 0
原创粉丝点击