返回值:成功:0,错误:出错编号。
pthread不是Linux系统默认的库而是POSIX线程库。在Linux中将其作为一个库来使用,因此编译时需要加上-pthread以显式链接该库
返回线程ID
线程标识符在进程中是唯一的,即分别属于两不同进程的两个线程可能有相同的线程标识符
retval:返回信息
参数表:
thread: 要等待的线程的pid
retval:用来存储被等待线程的返回值
返回0:成功;返回错误号:失败
主线程阻塞自己,等待子线程结束,然后回收子线程资源
可以设置线程能否被取消和取消后是否立即执行
参数表
state:PTHREAD_CANCEL_DISABLE或者PTHREAD_CANCEL_ENABLE
oldstate:指针类型,上一次取消状态的指针,可设NULL
type:PTHREAD_CANCEL_ASYNCHRONOUS立即取消
PTHREAD_CANCEL_DEFERRED等待事件(如pthread_join时)才取消
在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死,只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。 因此为了避免内存泄漏,所有线程的终止,要么已设为DETACHED,要么就需要使用pthread_join()来回收
返回0成功,错误号失败
分离后不可以再合并。该 *** 作不可逆
综合以上要想让子线程总能完整执行(不会中途退出),
注:很多地方参照了黄茹老师主编的《Linux环境高级程序设计》
C语言使用pthread_create()函数完成多线程的创建,pthread_create()函数共有四个参数。这四个参数分别为:
第一个 参数负责向调用者传递子线程的线程号
第二这个参数负责控制线程的各种属性,这也是线程在创建的时候,最为复杂的一个参数。下面是这个结构体的定义:
在结构体中的第一个参数 detachstate 说明了线程的分离状态。
PTHREAD_CREATE_DETACHED 分离状态:父线程在创建子线程之后,,父线程不会去等待子线程结束再去运行自己接下来的程序;
PTHREAD_CREATE_JOINABLE 状态:父线程会等待子线程运行结束,才继续运行接下来的程序。
注意的是如果当线程一旦处于 PTHREAD_CREATE_DETACHED 状态,那么线程的状态就无法再被修改了。线程创建时默认设置为PTHREAD_CREATE_JOINABLE状态
schedpolicy说明的是线程的调度策略,这个值可以分别被设置为:
SCHED_FIFO: 先进先出
SCHED_RR: 轮转法
SCHED_OTHER: 其他方法
schedparam参数实际上设置的是线程的优先级。这个参数仅当调度策略为实时(即SCHED_RR或SCHED_FIFO)时才有效
这个参数设置线程的调度参数是拷贝父线程的线程调度参数,还是上面的两个参数 schedpolicy 和 schedparam 属性进行设置。
该参数可以被设为:
PTHREAD_INHERIT_SCHED :表示新现成将继承创建线程的调度策略和参数)
PTHREAD_EXPLICIT_SCHED :表示使用在schedpolicy和schedparam属性中显式设置的调度策略和参数
scope参数设置的是线程优先级的使用范围。
PTHREAD_SCOPE_PROCESS 进程级竞争资源
PTHREAD_SCOPE_SYSTEM 系统级竞争资源
这个参数是线程栈的起始地址,这个参数只有在线程栈由自己创建时,才需要设置。当线程栈由用户直接创建,而不是通过系统创建时,线程栈的大小和位置都可以进行修改,但是用户程序需要完成对线程栈空间的释放。在设置该参数之后,guardsize警戒栈缓冲区的大小就变为0,为了防止栈溢出就需要对线程栈的境界栈缓冲区进行设置。
这个参数设置警戒栈缓冲区的大小。警戒栈缓冲区可以保护程序,防止栈溢出对数据造成破坏。
stacksize参数在线程创建之前创建,用来修改创建的线程栈的大小,但是最小不能低于 PTHREAD_STACK_MIN (16384) bytes ,即16k内存大小,也就是4个内存页(4个内存页这一点由内核决定)。
这个参数负责指定子线程需要允许的函数,这个参数需要的是一个函数指针。
这个参数负责指定,子线程所运行的函数的参数值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)