POSIX 线程编程小结

The Pthreads API

Pthreads API可以非正式地分为以下四组:

  1. 线程管理:
  2. 互斥:
  3. 条件变量:
  4. 同步:

线程管理

API:
#include <pthread.h>
int pthread_create(pthread_t *thread, pthread_attr_t *attr,
              void *(*start_routine)(void*), void *arg);
void pthread_exit(void *value_ptr);
int pthread_cancel(pthread_t thread);
int pthread_attr_destroy(pthread_attr_t *attr);
int pthread_attr_init(pthread_attr_t *attr);
创建线程:
  • 最初main程序由一个默认线程组成,其他线程必须显示地创建
  • pthread_create创建一个线程然后执行,可以在代码中的任意地方调用
  • pthread_create的参数
    • thread:返回新创建线程的独一无二的标识符
    • attr:用于设定线程属性的属性对象,NULL为默认值
    • start_routine: 需要线程执行的例程(函数的入口地址,也就是函数的指针)
    • arg: 传递给start_routine例程的参数,类型为void*
  • 一个进程可创建的最大线程数是由不同操作系统决定的
  • ulimit -a
线程属性(thread attribute object):
  • 默认情况下,被创建的线程带有一种属性。我们可以用属性对象来改变线程的属性。
  • pthread_attr_init 和 pthread_attr_destroy 用于初始化/销毁线程属性。
  • 其他例程用于设定或查询线性属性,其中包括:
    • Detached or joinable state
    • Scheduling inheritance
    • Scheduling policy
    • Scheduling parameters
    • Scheduling contention scope
    • Stack size
    • Stack address
    • Stack guard (overflow) size
线程绑定和调度
终止线程
  • 有多种方法来终止线程
  • 从start_routine正常返回
  • 线程调用pthread_exit
  • 线性调用pthread_cancel来终止其他线程
  • 调用exec() 或exit() 来结束整个进程
  • main() 结束
  • pthread_exit() 允许指定一个终止状态码
  • pthread_exit() 并不关闭打开的文件

加入(Joining) 和 分离(Detaching) 线程

API:
int pthread_join(pthread_t threadid, void **value_ptr);
int pthread_detach(pthread_t thread);
int pthread_attr_getdetachstate(pthread_attr_t *attr,
              int *detachstate);
int pthread_attr_setdetachstate(pthread_attr_t *attr, 
              int detachstate);
Joining:
  • pthread_join()例程阻塞调用线程,直到指定的线程标识为threadid的线程终止
  • pthread_join()可以获得目标线程的终止状态
  • 如果调用pthread_join()被canceled,那么目标进程就不会被分离
  • 同时对同一个目标线程调用pthread_join()的结果是未定义的
  • 如果pthread_join()成功返回,实现目标线程的资源将被回收,例如线程栈空间
Detaching
  • pthread_detach()可以使目标线程进入分离状态
  • 进入分离状态的线程在终止时会自动回收线程资源

栈管理

API:
int pthread_attr_getstacksize(pthread_attr_t *attr, 
        size_t *stacksize);
int pthread_attr_setstacksize(pthread_attr_t *attr, 
        size_t stacksize);
int pthread_attr_getstackaddr(pthread_attr_t *attr,
         void **restrict stackaddr);
int pthread_attr_setstackaddr(pthread_attr_t *attr, 
         void *stackaddr);

互斥量(Mutex Variables)

API:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t *attr);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

int pthread_mutexattr_destroy(pthread_mutexattr_t *attr);
int pthread_mutexattr_init(pthread_mutexattr_t *attr);
使用:
  • 互斥量使用之前必须初始化,有两种方法进行初始化
    1. 静态声明时 pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
    2. 动态分配 pthread_mutex_init()
  • attr目标用于去建立互斥锁的属性,Pthreads标准定义了三个属性:
    1. Process-shared:
    2. Protocol
    3. Prioceiling
  • pthread_mutexattr_init() 和 pthread_mutexattr_destroy()用于创建和销毁互斥锁属性
Locking 与 Unlocking 互斥锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
  • pthread_mutex_unlock()会返回错误如果当前进程没有获得这把锁或者这把锁已经unlock

条件变量(Condition Variables)

API:
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_init(pthread_cond_t* cond,pthread_condattr_t *attr);
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_condattr_destroy(pthread_condattr_t *attr);
int pthread_condattr_init(pthread_condattr_t *attr);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值