赞
踩
目录
一个进程可以包含多个线程,这些线程共享相同的代码(即应用程序的代码)、数据(包括全局变量、函数内的静态变量、堆空间的数据等)、进程空间(操作系统分配给进程的内存空间)、文件描述符(各个线程打开的文件资源,也可以为所有线程所共享),但每个线程都有自己的堆栈。
线程共享的属性(这些属性是进程范围而不是每个线程):
线程独有的属性:
实时调度策略和优先级
CPU亲和力/亲缘性
pthread_create()用来创建一个新的线程,其语法格式如下:
各个参数的含义是:
linux线程的终止的几种方式:
pthread_create如果调用成功,则返回0,如果失败则返回一个错误码,并且参数thread的值未定义。
pthread_self()用于获取调用线程的线程ID,其语法格式如下:
这个函数 调用总是成功,返回值为调用线程的线程ID。
pthread_exit()用于结束调用线程,其语法格式如下:
pthread_exit()函数终止调用线程并通过retval返回一个值(如果线程是非分离的),该值可用于调用pthread_join()的同一进程中的另一个线程。
当线程终止时,进程共享资源(例如互斥锁、条件变量、信号量和文件描述符)不会被释放,使用atexit()注册的函数也不会被调用。
在进程中的最后一个线程终止后,该进程通过调用exit()终止,退出状态为0;因此,进程共享资源被释放,使用atexit()注册的函数被调用。
注意,retval 不能指向函数内部的局部变量,否则会导致程序运行出错甚至崩溃。
pthread_cancel()用于向另一个线程发送取消请求,其语法格式如下:
pthread_cancel()函数向线程thread发送一个取消请求。目标线程是否以及何时对取消请求做出反应取决于该线程控制下的两个属性:其可取消性状态和类型。
线程的可取消状态由pthread_setcancelstate()决定,可以enable(新线程的默认值)或disable。如果线程已禁用取消,则取消请求将保持在队列中,直到该线程启用取消。如果线程启用了取消,那么它的可取消性类型确定取消发生的时间。
线程的取消类型由pthread_setcanceltype()决定,可以是异步的,也可以是延迟的(新线程的默认值)。异步可取消性意味着线程可以在任何时候被取消(通常是立即取消,但系统不保证这一点)。延迟取消性意味着取消将被延迟,直到线程下一次调用取消点的函数。
pthread_cancle执行成功则返回0,失败则返回非零错误码。
pthead_join()用于等待另一个线程结束。其语法格式如下:
pthread_join()函数等待thread指定的线程终止。如果该线程已经终止,那么pthread_join()立即返回。由thread指定的线程必须是可连接(即非分离)的。
如果retval不为NULL,那么pthread_join()将目标线程的退出状态(即,目标线程提供给pthread_exit()的值)复制到retval指向的位置。如果目标线程被取消了,那么将PTHREAD_CANCELED放置在retval指向的位置。
如果多个线程同时尝试与同一个线程进行连接,结果是未定义的。如果调用pthread_join()的线程被取消,那么目标线程将保持可连接状态(即不会被分离)。
成功时,pthread_join()返回0;如果发生错误,则返回错误码。常见的错误如下:
EDEADLK —— 检测到死锁(例如,两个线程试图相互连接);或参数thread指定调用线程。
EINVAL—— 线程不是一个可连接线程。
EINVAL—— 另一个线程已经在等待连接这个线程。
ESRCH —— 没有找到ID为thread的线程。
注意:
pthread_detach()用来分离一个线程。其语法格式如下:
pthread_detach()函数将thread标识的线程标记为已分离。当分离的线程终止时,其资源将自动释放回系统,而不需要另一个线程与终止的线程连接。
试图分离已经分离的线程会导致未指定的行为。
成功时,pthread_detach()返回0;如果发生错误,则返回错误码。
参考资料:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。