其他分享
首页 > 其他分享> > Pthreads API

Pthreads API

作者:互联网

大纲

一、 Introduction

1980-90s,存在数种不同的线程接口,1995年POSIX.1 c对POSIX线程API进行标准化,后来被SUSv3接受。

1.1 线程数据类型

数据类型描述
pthread_t线程ID
pthread_attr_t线程属性
pthread_mutex_t互斥变量
pthread_mutexattr_t
pthread_cond_t条件变量
pthread_condattr_t
pthread_key_t线程特有数据的键key
pthread_once_t一次性初始化控制上下文

二、 线程 Pthread

int pthread_create (pthread_t *__restrict __newthread,
			   const pthread_attr_t *__restrict __attr,
			   void *(*__start_routine) (void *),
			   void *__restrict __arg) ; // 创建新线程
void pthread_exit (void *__retval) ; // 终止本线程
int pthread_join (pthread_t __th, void **__thread_return); // 连接线程th,只能以阻塞态执行
int pthread_detach (pthread_t __th); // 线程分离
pthread_t pthread_self (void); // 获取本线程ID
int pthread_equal (pthread_t __thread1, pthread_t __thread2); // 比较线程ID,是否相等
int pthread_yield (void); // 主动让出CPU,触发线程调度。
int pthread_cancel (pthread_t __th); // 终止线程th

三、 互斥量 mutex

作用:保护对共享变量的访问

mutex : mutual exclusion

pthread_mutex_t mtx = PTHREAD_MUTEX_INITTIALIZER;

int pthread_mutex_lock(pthread_mutex_t* mutex);
int pthread_mutex_unlock(pthread_mutex_t* mutex);
int pthread_mutex_trylock(pthread_mutex_t* mutex);
int pthread_mutex_timedlock (pthread_mutex_t *__restrict __mutex,
				    const struct timespec *__restrict __abstime);

3.1 动态分配的 mutex

静态初始值PTHREAD_MUTEX_INITIALIZER,只能用于初始化:静态分配且携带默认attribute 的mutex。
其他情况下,必须调用pthread_mutex_init()进行动态初始化。

int pthread_mutex_init (pthread_mutex_t *__mutex,
			       const pthread_mutexattr_t *__mutexattr);
int pthread_mutex_destroy (pthread_mutex_t *__mutex);

3.2 mutex的类型

对于以下行为,结果取决于mutex的类型:

PTHREAD_MUTEX_NORMAL

PTHREAD_MUTEX_ERRORCHECK

PTHREAD_MUTEX_RECURSIVE

非标准的静态初始值

四、 条件变量 condition value

作用:通知状态的改变

4.1 general

pthread condition提供如下函数,用于线程间同步的通知:

int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr);//创建一个condition的内核变量
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);//等待内核变量变为signaled
int pthread_cond_timewait(pthread_cond_t *cond,pthread_mutex *mutex,const timespec *abstime);//在指定时间内等待内核心变量变为signaled
int pthread_cond_destroy(pthread_cond_t *cond);//“析构”一个condition的内核变量
int pthread_cond_signal(pthread_cond_t *cond);//把内核变量置为signaled,指定一个等待线程激活,但不能指定特定线程
int pthread_cond_broadcast(pthread_cond_t *cond);//把内核变量置为signaled,指定所有等待线程激活

4.2 静态初始化和动态初始化

与mutex 类似

pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 静态初始化
int pthread_cond_init(pthread_cond_t *cond,pthread_condattr_t *cond_attr); // 动态初始化

4.3 condition value 总是与一个 mutex 相关

signal()使用案例

pthread_mutex_lock(&mtx);
// 在此修改共享变量, mutex 起保护共享变量作用
pthread_mutex_unlock(&mtx);
pthread_cond_signal(&cond); // 唤醒wait()线程

wait()使用案例

pthread_mutex_lock(&mtx);
while(x) // 在这里check 共享变量状态,如果不满足,则进入循环体
{
	pthread_mutex_wait(&cond, &mtx); // 注意wait()上下文环境,理解wait()的操作
}
// 这里使用共享变量
pthread_mutex_unlock(&mtx); // 因为wait()自动lock了mutex,所以这里要unlock。

4.4 动态分配的要销毁

int pthread_cond_destroy(pthread_cond_t *cond);

标签:__,线程,int,Pthreads,API,cond,pthread,mutex
来源: https://blog.csdn.net/hua0918xing/article/details/112575231