Chinaunix首页 | 论坛 | 博客
  • 博客访问: 62889
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-18 10:40
文章分类

全部博文(26)

文章存档

2013年(26)

我的朋友

分类: LINUX

2013-10-13 18:29:31


#include
int pthread_equal(pthread_t tid1,pthread_t tid2);//比较两个线程
pthread_t pthread_self(void)//获得调用线程的ID
int pthread_creat(pthread_t *restrict tidp,const pthread_attr *restrict attr,void*(*start_rin)(void),void*restrict arg);


void pthread_exit(void *rval_ptr);//进程中其他线程可以通过调用pthread_join函数访问到这个指针
int pthread_join(pthread_t thread,void **rval_ptr);//调用线程将一直阻塞,直到制定的线程调用pthread_exit,从启动例程中返回或者被取消。


int pthread_cancel(pthread_t tid);//请求取消同一进程的中的其他线程


void pthread_cleanup_push(void(*rin)(void*),void *arg);
void pthread_cleanup_pop(int execute);


互斥锁
#include
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
对互斥量进行加锁,需要调用pthread_mutex_lock.如果互斥量已经上锁,调用线程将阻塞直到互斥量被解锁,解锁调用pthread_mutex_unlock
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);


读写锁
#include
int pthread_rwlock_init(pthread _rwlock_t *rwlock,const pthread_rwlockarrt_r attr);
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);


条件变量
给多个线程提供了一个会合的场所,条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。
int pthread_cond_init(pthread_cond_t *cond,pthread_condattr *attr)
int pthread_cond_destroy(pthread_cond_t *cond);


int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
int pthread_cond_timedwait(pthread_cond_t *cond,pthread_mutex_t *mutex,const struct timespec *timeout)


int pthread_cond_signal(pthread_cond-t *cond);
int ptread_cond_broadcast(ptread_cond_t *cond);


twelve pthread control
同一进程中的多个线程如何保持数据的私有性,基于进程的系统调用如何与线程进行交互。


#include
int pthread_attr_init(pthread_attr_t *attr);//初始化pthread_attr_t 结构,包含操作系统支持的线程所有属性的默认值。
int pthread_attr_destroy(pthread_attr_t *attr);


线程属性:
detachstate 线程的分离状态属性
guardsize  线程的栈末尾的警戒缓冲区大小(避免栈溢出的扩展内存大小)(字节数)
stackaddr 线程栈的最低地址
stacksize 线程栈的大小(字节数)


int pthread_attr_getdatachstate(const pthread_attr_t *attr,int *datachstate);
int pthread_attr_setdatachstate(const pthread_attr_t *attr,ing detachstate);




int  pthread_attr_getstack(const pthread_attr_t *attr,void **stackaddr,size_t *stacksize);
int pthread_attr_setstack(const pthread_attr_t *attr,void*stackaddr,size_t *stacksize);


如何希望改变栈的默认大小,又不想自己处理线栈的分配问题,这时使用
int pthread_attr_getstacksize(const pthread_attr_t *attr,size_t *stacksize)
int pthread_attr_setstacksize(pthread_attr_t *atr,size_t stacksize)




int pthread_attr_getguardsize(const pthread_attr_t *attr,size_t *guardsize)
int pthread_attr_setguardsize(pthread_attr_t *attr,size_t guardsize);


同步属性,互斥量,读写锁,条件变量的属性
pthread_mutexattr_t attr 结构
int pthread_mutexattr_init(pthread_mutexattr_t *attr);//用默认的互斥量属性初始化attr结构,注意属性:进程共享属性和类型属性
int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);


线程私有数据
在使用私有数据前,需要创建与该数据关联的键,整个键用于获取对线程私有数据的访问权。整个键可以被进程中的所有线程使用,但是每个线程把整个键与不同的线程私有数据地址关联。创建新键时,每个线程的数据地址设为NULL。
int pthread_key_create(pthread_key_t *keyp,void(*destructor)(void *))
int pthread_key_delete(pthread_key_t key);




pthread_once_t initflag=PTHREAD_ONCE_INIT;
int pthread_once(pthread_once_t *initflag,void(*initfn)(void));


void *pthread_getspecific(pthread_key_t key);
int pthread_setspecific(pthread_key_t key,const void *value);


线程与信号
信号由所有线程共享,修改某个信号相关的处理行为以后,所有的线程都共享整个处理行为的改变
int pthread_sigmask(int how,const sigset_t set,sigset_t oset);
int sigwait(const sigset_t *set,int *signop);


把信号发送到线程,可以调用pthread_kill
#include
int pthread_kill(pthread_t thread,ing signo)




线程与fork
在子进程内部只存在一个线程,是由父进程中调用fork的线程的副本构成的。
如果父进程占有锁,子进程同样占有这些锁。但是子进程不包含占有锁的线程的副本,所以子进程没有办法直到它占有乐那些锁并且需要释放哪些锁。


清除锁状态,通过调用pthread_atfork函数建立fork处理程序
int pthread_atfork(void (*prepare)(void),void(*parent)(void),void(*child)(void));


线程与I/O
进程中的所有线程共享相同的文件描述符。
可以使读操作和设置偏移量成为一个原子操作
pread(fd,buf1,100,300)




thirteen deamon process
守护进程的创建规则
1)调用umask将文件模式屏蔽字设置为0
2)调用fork,然后父进程退出,保证子进程不是一个进程组的组长进程
3)调用setsid创建一个新会话,使调用进程成为新会话首进程,成为一个新进程组的组长进程,没有控制终端
4)将当前工作目录改为根目录
5)关闭不许要的文件描述符
6)某些进程打开/dev/null使具有文件描述符0,1,2
阅读(625) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~