pthread
pthread: POSIX Threads
pthread 是 POSIX 标准的线程 API, 放在头文件 <pthread.h>
中,并由 libc 提供实现。
参考
pthread API
标准 pthread API 包括以下几部分
- 线程管理:创建、检测、合并等
- 互斥锁(mutex):创建、销毁、加锁、解锁等
- 条件变量:在线程间共享锁、创建、销毁、等待和信号
-
同步:管理读写锁和屏障
API 命名结构如下:
Routine Prefix | Functional Group |
---|---|
pthread_ |
Threads themselves and miscellaneous subroutines |
pthread_attr_ |
Thread attributes objects |
pthread_mutex_ |
Mutexes |
pthread_mutexattr_ |
Mutex attributes objects. |
pthread_cond_ |
Condition variables |
pthread_condattr_ |
Condition attributes objects |
pthread_key_ |
Thread-specific data keys |
pthread_rwlock_ |
Read/write locks |
pthread_barrier_ |
Synchronization barriers |
线程管理
创建和终止线程
包括以下函数
-
pthread_create(thread,attr,start_routine,arg)
创建线程 pthread_exit(status)
pthread_cancel(thread)
-
pthread_attr_init(attr)
创建线程属性对象 pthread_attr_destroy(attr)
注意:
- 每个线程结束时最后都调用
pthread_exit
返回 - 最好主函数也用
pthread_exit
返回
合并和检测线程
pthread_join (threadid,status)
pthread_detach (threadid)
pthread_attr_setdetachstate (attr,detachstate)
pthread_attr_getdetachstate (attr,detachstate)
注意:
- 如果线程需要被
join
最好显式设置joinable
属性,因为不是所有实现都默认加这个属性
栈管理
pthread_attr_getstacksize (attr, stacksize)
pthread_attr_setstacksize (attr, stacksize)
pthread_attr_getstackaddr (attr, stackaddr)
pthread_attr_setstackaddr (attr, stackaddr)
注意:
- 线程的栈大小是实现相关的,所以为了程序可移植,最好自己设置栈大小
其它
pthread_self ()
pthread_equal (thread1,thread2)
pthread_once (once_control, init_routine)
互斥锁
典型的使用锁的过程是
- 创建并初始化锁变量
- 几个线程尝试加锁
- 只有一个会成功并获得锁
- 获得锁的线程进行一些操作
- 释放锁
- 另一个线程尝试获得锁
- 最终锁被销毁
创建和销毁锁
pthread_mutex_init (mutex,attr)
pthread_mutex_destroy (mutex)
pthread_mutexattr_init (attr)
pthread_mutexattr_destroy (attr)
注意:
- 创建锁变量可以用
pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;
, 也可以用pthread_mutex_init()
加锁和解锁
pthread_mutex_lock (mutex)
pthread_mutex_trylock (mutex)
pthread_mutex_unlock (mutex)
条件变量
条件变量也是用于线程间同步的机制,与加锁的共享内存不同,条件变量用于传递消息。
创建和销毁条件变量
pthread_cond_init (condition,attr)
pthread_cond_destroy (condition)
pthread_condattr_init (attr)
pthread_condattr_destroy (attr)
注意:
- 创建条件变量可以用
pthread_cond_t myconvar = PTHREAD_COND_INITIALIZER;
也可以用pthread_cond_init()
等待和通信
-
pthread_cond_wait (condition,mutex)
阻止线程直到某个条件被通信过来,应该在加锁时使用,会在等待时自动释放锁,当获得信号时又会把锁加回来 -
pthread_cond_signal (condition)
用来向其它等待中的线程传递信号,应该在加锁时使用,在操作后传信号,最后解锁 -
pthread_cond_broadcast (condition)
用来向多个线程传递信号
注意:
- 等待锁时应该使用
while
循环判断而不是if
评论
Comments powered by Disqus