您的位置:首页 > 产品设计 > UI/UE

apue 第十二章 线程控制

2015-07-30 02:17 441 查看
线程属性:

pthread_attr_init(phtread_attr_t *attr)初始化

pthread_attr_destroy

detachstate:线程的分离状态

pthread_attr_getdetachstate(const pthread_attr_t *restrict attr,int *detachstate)获取attr中的分离状态属性

参数detachstate取值为 PTHREAD_CREATE_DETACHED以分离状态启动线程(不需要且不能调用pthread_join来获取退出状态)PTHREAD_CREATE_JOINABLE 正常启动

pthread_attr_setdetachstate(attr,detachstate)设置分离状态属性

stackaddr:线程栈的最低地址

当进程中虚地址空间不够时,可在堆上申请存储空间做为线程的虚地址空间

pthread_attr_getstack(* attr,** stackaddr,*stacksize)

pthread_attr_setstack(*attr,*stackaddr,stacksize)

stacksize:线程栈的最小长度(即上面的stacksize参数)

pthread_attr_get/set

由系统来分配空间,stacksize不能小于PTHREAD_STACK_MIN

guardsize:线程栈的末尾的警戒缓冲区大小(线程栈指针溢出到警戒缓冲区时进程就会收到出错信号)

互斥锁属性:

共享属性:

pthread_mutexattr_getshared/setshared

PTHREAD_PROCESS_SHARED(进程间共享) PTHREAD_PROCESS_PRIVATE(默认的行为)

进程间通信的共享内存方式中,在共享内存中分配互斥量,并设置为共享属性,则可以用于进程同步。

健壮性:

pthread_mutexattr_getrobust/setrobust

PTHREAD_MUTEX_STALLED

在设置了共享属性后,如果进程间共享的互斥锁被一个进程持有,而该进程在解锁之前退出,那么其他试图加锁的进程就会永久阻塞。

PTHREAD_MUTEX_ROBUST

如果发生了上述情况pthread_mutex_lock返回EOWNERDEAD(需要恢复的成功)

类型属性:

PTHREAD_MUTEX_NORMAL 不做错误检查或死锁检测

/ERRORCHECK 提供错误检查

/RECURSIVE 允许多次加锁,在互斥量中维护一个计数。

/DEFAULT 默认,linux中映射为NORMAL

线程特定数据:
http://www.cnblogs.com/javawebsoa/archive/2013/08/09/3249130.html
下面看一个具体的过程,启动一个进程并创建了若干线程,其中一个线程(比如线程1),要申请线程私有数据,系统调用pthread_key_creat()在图1所示的key结构数组中找到第一个未用的元素,并把它的键,也就是看面说的索引(0-127),返回给调用者,假设返回的索引是1,线程之后通过pthrea_getspecific()调用获得本线程的pkey[1]值,返回的是一个空指针ptr = null,这个指针就是我们可以通过索引1使用的线程数据的首地址了,但是他现在为空,因此根据实际情况用malloc分配一快内存,在使用pthread_setspecific()调用将特定数据的指针指向刚才分配到内存区域。整个过程结束后key结构和pthread结构如图3所示,



pthread_once_t initflag=PHTREAD_ONCE_INIT
pthread_once(pthread_once_t *initflag,void (*initfn)(void))

保证初始化程序(常常调用pthread_key_create来创建一个键)只被一个线程调用

取消选项:

pthread_setcancelstate(int state,int *oldstate)

设置线程的可取消状态

state可取值 PTHREAD_CANCEL_ENABLE PTHREAD_CANCEL_DISABLE

对一个可取消线程调用Pthread_cancel时,线程不会立刻取消,而是在到达取消点时取消

对一个不可取消的线程调用cancel时,取消请求会挂起,并在取消状态变成可取消时,在下一个取消点处理所有挂起的取消信号

取消点是在程序中调用一些函数,同时也可用pthread_testcancel设置取消点

pthread_setcanceltype(int type ,int *oldtype) 设置线程取消类型

PTHREADCANCEL_DEFERRED 推迟

PTHREADCANCEL_ASYNCHRONOUS 异步 可以在任意时间取消,不一定是在取消点

pthread_sigmask(int how,const sigset_t *restrict set,sigset_t *oset)

用来设置线程信号屏蔽。每个线程都有自己独立的信号屏蔽字,进程使用sigpromask(失败时返回-1)设置,线程使用pthread_sigmask(失败时返回错误码),但是所有的线程都共享同一个信号处理函数

sigwait(set,int *restrict signop) signop为set中包含的信号的数量

在使用sigwait之前阻塞其要等待的信号,sigwait会原子的解除对这些信号的阻塞,并在返回之前恢复原来的信号屏蔽字

pthread_kill(pthread_t tid,int signo)

向指定线程发送信号,信号的处理是所有线程共享的,所以如果动作是终止进程,那么将信号传递给某一个线程扔会终止整个进程

线程和fork

子进程集成了父进程的互斥量、读写锁和条件变量的状态,如果父进程是多线程,子进程只有一个线程,即父进程调用fork的线程。这时子进程无法判断由父进程中其他线程对锁的占有状态

pthread_atfork(void (*prepare)(void),void (*parent)(void),void(*child)(void))

prepare在调用fork()后开始执行,parent和child在fork()返回之前执行

可以多次调用atfork函数来注册多个函数

prepare执行顺序与注册顺序相反,parent/child与注册顺序相同

#include <unistd.h>

pread/pwrite(int fd,char *buf,size,pos)

线程安全的IO函数,将读取与seek成为一个原子操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: