POSIX线程指南

来源:互联网 发布:巴基斯坦工作知乎 编辑:程序博客网 时间:2024/06/11 01:49
31.线程属性
  可以在调用pthread_create之前为线程创建属性对象;
  注意初始化属性对象后, 记得销毁属性对象.
  
  32.pthread_attr_init
  int pthread_attr_init(pthread_attr_t *tattr);
  
  介绍:
  将对象属性初始化为缺省值.
  
  返回值:
  成功返回0;
  其他表示出错.
  ENOMEM:内存不足.
  
  示例:
  pthread_attr_t attr;
  int ret = pthread_attr_init(&attr);
  
  缺省的线程属性如下:
  scope PTHREAD_SCOPE_PROCESS 新线程和进程中的线程竞争
  detach PTHREAD_CREATE_JOINABLE 线程退出后保留线程状态和ID
  stackaddr NULL 系统分配的栈地址
  stacksize 0 系统定义的栈大小
  priority 0 新线程优先级为0
  inherit PTHREAD_EXPLICIT_SCHED 新线程不继承父线程的调度优先级
  schedpolicy SCHED_OTHER
  
  33.pthread_attr_destroy
  int pthread_attr_destroy(pthread_attr_t *tattr);
  
  介绍:
  销毁初始化时分配的存储空间.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  34.pthread_attr_setdetachstate
  int pthread_attr_setdetachstate(pthread_attr_t *tattr, int detachstate);
  
  介绍:
  非分离线程必须被join来释放该线程的资源.
  分离线程一退出, 便可重用其线程ID和资源.
  如果不需要等待线程退出, 请使用分离线程.
  detachstate可以是PTHREAD_CREATE_DETACHED or PTHREAD_CREATE_JOINABLE.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  示例:
  ret = pthread_attr_init(&attr);
  ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
  ret = pthread_create(&tid, &attr, start_routine, arg);
  
  35.pthread_attr_getdetachstate
  int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
  
  介绍:
  检查线程的创建状态.
  
  返回值:
  成功返回0;
  其他表示出错.
  EINVAL:detachstate为NULL or attr无效.
  
  36.pthread_attr_setscope
  int pthread_attr_setscope(pthread_attr_t *attr, int scope);
  
  介绍:
  设置线程的争用范围:PTHREAD_SCOPE_SYSTEM(与系统中所有线程竞争) or PTHREAD_SCOPE_PROCESS(与进程中线程竞争).
  
  返回值:
  成功返回0;
  其他表示出错.
  
  37.pthread_attr_getscope
  int pthread_attr_getscope(pthread_attr_t *attr, int *scope);
  
  介绍:
  获得线程的争用范围.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  38.pthread_setconcurrency
  int pthread_setconcurrency(int new_level);
  
  介绍:设置线程的并发级别.
  
  39.pthread_getconcurrency
  int pthread_getconcurrency();
  
  介绍:获得线程的并发级别.
  
  40.pthread_attr_setschedpolicy
  int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
  
  介绍:设置线程的调度策略.
  policy为SCHED_FIFO(先进先出), SCHED_RR(循环), SCHED_OTHER(其他).
  
  返回值:
  成功返回0;
  其他表示出错.
  
  41.pthread_attr_getschedpolicy
  int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);
  
  介绍:获得线程的调度策略.
  policy为SCHED_FIFO(先进先出), SCHED_RR(循环), SCHED_OTHER(其他).
  
  返回值:
  成功返回0;
  其他表示出错.
  
  42.pthread_attr_setschedparam
  int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
  
  介绍:
  设置线程的优先级参数.
  
  示例:
  sched_param param;
  param.sched_priority = 30;
  int ret = pthread_attr_setschedparam(&attr, ¶m);
  
  返回值:
  成功返回0;
  其他表示出错.
  
  43.pthread_attr_getschedparam
  int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
  
  介绍:
  获得线程的优先级参数.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  eg:
  pthread_attr_t attr;
  pthread_t tid;
  int ret, newprio = 20;
  struct sched_param param;
  
  ret = pthread_attr_init(&attr);
  ret = pthread_attr_getschedparam(&attr, ¶m);
  param.sched_priority = newprio;
  ret = pthread_attr_setschedparam(&attr, ¶m);
  
  ret = pthread_create(&tid, &attr, func, arg);
  
  44.pthread_attr_setstacksize
  int pthread_attr_setstacksize(pthread_attr_t *attr, size_t size);
  
  介绍:
  设置线程栈大小. size应该大于系统定义的最小栈PTHREAD_STACK_MIN大小.
  size = 0 使用缺省大小.
  
  返回值:
  成功返回0;
  其他表示出错.
  EINALV:size小于PTHREAD_STACK_MIN or 超出系统限制 or attr无效.
  
  45.pthread_attr_getstacksize
  int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *size);
  
  介绍:
  获得线程栈大小.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  46.线程栈的相关介绍
  线程栈是从页面边界开始的, 任何指定栈大小都会向上舍入到下一个页边界.
  pthread_create创建线程时, 系统使用mmap的MAP_NORESERVE为每个线程栈分配虚拟内存, 但不保留任何交换空间.
  系统将无效的内存页附加到线程栈的溢出端来捕捉栈溢出.访问此类内存页将导致内存访问故障SIGSEGV信号.
  
  47.pthread_attr_setstack
  int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
  
  介绍:
  设置线程栈的地址和大小.
  stackaddr定义线程栈的基准低地址, stacksize指定线程栈大小.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  示例:
  void *base = (void *)malloc(PTHREAD_STACK_MIN + 0x4000);
  int ret = pthread_attr_setstack(&attr, base, PTHREAD_STACK_MIN + 0x4000);
  
  48.pthread_attr_getstack
  int pthread_attr_getstack(pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
  
  介绍:
  获得线程属性中线程栈地址和大小.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  49.POSIX线程同步对象
  互斥锁
  条件变量
  读写锁
  信号
  
  50.互斥锁
  使用互斥锁可以确保一次只有一个线程执行代码的临界段.
  
  51.pthread_mutexattr_init
  int pthread_mutexattr_init(pthread_mutexattr_t *mattr);
  
  介绍:
  初始化互斥锁对象属性.
  缺省的mutexattr为PTHREAD_PROCESS_PRIVATE, 对象分配类型为opaque由系统分配的属性对象.
  
  返回值:
  成功返回0;
  其他表示出错.ENOMEM:内存不足, 无法初始化互斥锁属性对象.
  
  示例:
  pthread_mutexattr_t mattr;
  int ret = pthread_mutexattr_init(&mattr);
  
  52.pthread_mutexattr_destroy
  int pthread_mutexattr_destroy(pthread_mutexattr_t *mattr);
  
  介绍:
  销毁创建mutexattr初始化分配的内存
  
  返回值:
  成功返回0;
  其他表示出错.
  
  53.pthread_mutexattr_setpshared
  int pthread_mutexattr_setpshared(pthread_mutexattr_t *mattr, int pshared);
  
  介绍:
  设置互斥锁的作用域.
  pshared可以是PTHREAD_PROCESS_PRIVATE(进程内专用锁) or PTHREAD_PROCESS_SHARED(系统范围内的锁, 在多个进程中的线程互斥, 可以用于共享内存).
  
  返回值:
  成功返回0;
  其他表示出错.
  
  54.pthread_mutexattr_getpshared
  int pthread_mutexattr_getpshared(pthread_mutexattr_t *mattr, int *pshared);
  
  介绍:
  获得互斥锁范围.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  55.pthread_mutexattr_settype
  int pthread_mutexattr_settype(pthread_mutexattr_t *mattr, int type);
  
  介绍:
  设置锁的类型:
  PTHREAD_MUTEX_NORMAL:不会检测死锁;
  PTHREAD_MUTEX_ERRORCHECK:出错检测;
  PTHREAD_MUTEX_RECURSIVE:递归锁;
  PTHREAD_MUTEX_DEFAULT:不能递归锁定, 解锁非本线程锁定的锁将产生不确定行为.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  56.pthread_mutexattr_gettype
  int pthread_mutexattr_gettype(pthread_mutexattr_t *mattr, int *type);
  
  介绍:
  获得锁的类型.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  57.pthread_mutexattr_setprotocol
  int pthread_mutexattr_setprotocol(pthread_mutexattr_t *mattr, int protocol);
  
  介绍:
  设置锁的属性对象.
  PTHREAD_PRIO_NONE:线程优先级和调度不受互斥锁拥有权的限制;
  PTHREAD_PRIO_INHERIT
  PTHREAD_PRIO_PROTECT
  
  返回值:
  成功返回0;
  其他表示出错.
  
  58.pthread_mutexattr_getprotocol
  int pthread_mutexattr_getprotocol(pthread_mutexattr_t *mattr, int *protocol);
  
  介绍:
  获得锁的属性对象.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  59.pthread_mutexattr_setprioceiling
  int pthread_mutexattr_setprioceiling(pthread_mutexattr_t *mattr, int prioceiling, int *oldceiling);
  
  介绍:
  设置互斥锁属性对象的优先级上限.
  优先级上限定义执行临界区的优先级.
  
  返回值:
  成功返回0;
  其他表示出错.
  
  60.pthread_mutexattr_getprioceiling
  int pthread_mutexattr_getprioceiling(pthread_mutexattr_t *mattr, int *prioceiling);
  
  介绍:
  获得互斥锁属性对象的优先级上限.
  
  返回值:
  成功返回0;
  其他表示出错.

原创粉丝点击