POSIX多线程--线程基本操作接口

来源:互联网 发布:黑暗之魂 隐藏 知乎 编辑:程序博客网 时间:2024/06/05 00:37

与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的

链接这些线程函数库时要使用编译器命令的”-lpthread“选项

int pthread_create(pthread_t thread, const pthread_attr_t *attr, void (start_routine)(void), void *arg);
功能:创建一个新的线程
参数:
thread:返回线程ID
attr:设置线程的属性,attr为NULL表示使用默认属性
start_routine:是函数地址,线程启动后要执行的函数(所指向的函数要接受一个无类型(void)参数,函数返回值类型也为无类型)
arg:传递给线程启动函数的参数

返回值:成功返回0;失败返回错误码

错误检测

* 传统的一些函数是,成功返回0,失败返回-1,并且对全局变量errno赋值以指示错误* pthreads函数出错时不会设置全局变量errno,而是将错误代码通过返回值返回* pthreads统一也提供线程内的errno变量,以支持其他使用errno的代码。对于pthreads函数的错误,建议通过返回值判定,因为读取返回值要比读取线程内的errno变量开销更小

通常处理方法:
if((ret = pthread_create(&tid, NULL, thread_routine, NULL))){
fprintf(stderr, “pthread_create:%s\n”, strerror(ret));
}

int pthread_join(pthread_t thread, void ** retval);
功能:以阻塞方式等待一个thread指定的线程结束。当函数返回时,被等待线程的资源别收回。
参数:thread:线程标识符
retval:用户定义的指针,用来存储被等待线程的返回值。
返回值:0表示成功。失败,返回错误号。

int pthread_exit(void *value_ptr);
功能:线程终止
参数:
value_ptr:
返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)

int pthread_cancel(pthread_t thread);
功能:取消一个执行中的进程 – 一个进程可以杀死另外一个线程
参数:thread:线程ID
返回值:成功返回0;失败返回错误码

pthread_t pthread_self(void);
功能:返回当前线程ID
返回值:成功返回0

int pthread_detach(pthread_t thread);
功能:讲一个线程分离
参数:thread:线程ID
返回值:成功返回0;失败返回错误码
例:pthread_detach(pthread_self());//将当前线程设置为分离状态–避免僵线程产生

进程和线程的对比
这里写图片描述

线程

* 进程里执行代码的部分;* 包含一系列机器指令所必须的机器状态,包括当前指令位置(一般为PC寄存器)、栈顶指针SP、通用寄存器、地址和数据寄存器等。* 线程不包括进程中的其他数据,如地址空间和文件描述符;

进程

* 线程加上地址空间、文件描述符和其他数据。* 一个进程中的所有线程共享文件和地址空间,包括程序段、数据段和堆栈;

为什么用多线程?
1
多线程相对于进程相比,它是一种非常“节俭”的多任务操作方式。在linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护他的代码段,数据段和堆栈段。而运行一个进程中的多个线程,它们彼此使用相同的地址空间,共享大部分数据,启动一个线程所花费的空间远远小于启动一个进程。
2
多线程间方便的通信机制。对不同进程来说,它们有独立的数据空间,要进行数据的传递只能通过通信的方式进行。线程则不然,由于同一线程下的线程之间共享数据空间,所以一个线程的数据空有直接别其他线程所使用。

0 0
原创粉丝点击