您的位置:首页 > 其它

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

2015-08-29 15:30 323 查看
与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“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

多线程间方便的通信机制。对不同进程来说,它们有独立的数据空间,要进行数据的传递只能通过通信的方式进行。线程则不然,由于同一线程下的线程之间共享数据空间,所以一个线程的数据空有直接别其他线程所使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: