您的位置:首页 > 运维架构 > Linux

Linux Pthread 总结

2016-05-20 11:40 316 查看
POSIX线程(POSIX
threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac
OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32。
作用

线程库实行了POSIX线程标准通常称为Pthreads。POSIX线程具有很好的可移植性,使用pthreads编写的代码可运行于Solaris、FreeBSD、Linux 等平台,Windows平台亦有pthreads-win32可供使用[1] 。

Pthreads定义了一套C语言的类型、函数与常量,它以pthread.h头文件和一个线程库实现。


数据类型

编辑

pthread_t:线程ID

pthread_attr_t:线程属性


操纵函数

编辑

pthread_create():创建一个线程

pthread_exit():终止当前线程

pthread_cancel():中断另外一个线程的运行

pthread_join():阻塞当前的线程,直到另外一个线程运行结束

pthread_attr_init():初始化线程的属性

pthread_attr_setdetachstate():设置脱离状态的属性(决定这个线程在终止时是否可以被结合)

pthread_attr_getdetachstate():获取脱离状态的属性

pthread_attr_destroy():删除线程的属性

pthread_kill():向线程发送一个信号


同步函数

编辑

用于 mutex 和条件变量

pthread_mutex_init() 初始化互斥锁

pthread_mutex_destroy() 删除互斥锁

pthread_mutex_lock():占有互斥锁(阻塞操作)

pthread_mutex_trylock():试图占有互斥锁(不阻塞操作)。即,当互斥锁空闲时,将占有该锁;否则,立即返回。

pthread_mutex_unlock(): 释放互斥锁

pthread_cond_init():初始化条件变量

pthread_cond_destroy():销毁条件变量

pthread_cond_signal(): 唤醒第一个调用pthread_cond_wait()而进入睡眠的线程

pthread_cond_wait(): 等待条件变量的特殊条件发生

Thread-local storage(或者以Pthreads术语,称作线程特有数据):

pthread_key_create(): 分配用于标识进程中线程特定数据的键

pthread_setspecific(): 为指定线程特定数据键设置线程特定绑定

pthread_getspecific(): 获取调用线程的键绑定,并将该绑定存储在 value 指向的位置中

pthread_key_delete(): 销毁现有线程特定数据键

pthread_attr_getschedparam();获取线程优先级

pthread_attr_setschedparam();设置线程优先级


工具函数

编辑

pthread_equal(): 对两个线程的线程标识号进行比较

pthread_detach(): 分离线程

pthread_self(): 查询线程自身线程标识号

-
1.线程特点
-
2.pthread创建
-
3.pthread终止
- 4.mutex互斥量使用框架
- 5.cond条件变量
================================================================================================
1. 线程特点

线程拥有自己独立的栈、调度优先级和策略、信号屏蔽字(创建时继承)、errno变量以及线程私有数据。进程的其他地址空间均被所有线程所共享,因此线程可以访问程序的全局变量和堆中分配的数据,并通过同步机制保证对数据访问的一致性。

2. pthread创建

pthread有一个线程ID,类型为pthread_t,在使用printf打印时,应转换为u类型。

pthread_equal可用于比较两个id是否相等;pthread_self用于获取当前线程的ID。

pthread_create用于创建新的线程,可以给线程传入一个void *类型的参数,例如一个结构体指针或者一个数值。

系统并不能保证哪个线程会现运行:新创建的线程还是调用线程。

3. pthread终止

a) 从线程函数中返回

b) 被同一进程中的其他线程取消

c) 线程调用pthread_exit

注意,线程的返回值需要转换为void *类型。

pthread_exit(void *ret)

pthread_join(pthread_t id, void **ret)

ret均可设置为NULL

4. mutex 互斥量使用框架

pthread_mutex_t lock;

pthread_mutex_init 或者 PTHREAD_MUTEX_INITIALIZER(仅可用在静态变量)

pthread_mutex_lock / pthread_mutex_unlock / pthread_mutex_trylock

pthread_mutex_destroy

5. cond 条件变量

pthread_cond_t qready;

pthread_mutex_t qlock;

pthread_mutex_init 或者 PTHREAD_MUTEX_INITIALIZER

pthread_cond_init 或者 PTHREAD_COND_INITIALIZER

pthread_mutex_lock(&qlock...)

pthread_cond_wait(&qready, &qlock...) / pthread_cond_timewait

pthread_mutex_unlock(&qlock)

pthread_cond_destroy

//唤醒条件变量

pthread_cond_signal

pthread_cond_broadcast

条件变量是pthread中比较难以理解的一点,主要会产生以下疑惑:

Q1. 假如在调用pthread_{cond_wait | cond_timedwait}之前就调用pthread_cond_{signal | broadcast}会发生什么?

Q2. pthread_cond_{cond_wait | cond_timewait}为什么需要一个已经锁住的mutex作为变量?

Q3. pthread_cond_{signal | broadcast}使用之前必须获取wait中对应的mutex吗?

Q4. 假如pthread_cond_{signal | broadcast}必须获取mutex,那么下列两种形式,哪种正确?为什么?

1)

lock(lock_for_X);

change(X);

unlock(lock_for_X);

pthread_cond_{signal | broadcast};

2)

lock(lock_for_X);
change(X);
pthread_cond_{signal | broadcast};

unlock(lock_for_X);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: