本文记录学习操作系统线程的相关概念及常用API的用法。具体包括线程的概念、标识、线程创建方法以及线程之间同步方法。
概念
线程是系统调用的基本单位,在同一个进程内,线程共享进程之间的资源。
线程通过线程ID来标识,即pthread_t,线程ID时无符号长整型。
获取线程的ID:pthread_t pthread_self(void);
比较两个线程是否相等:int pthread_equal(pthread_t tid1, pthread_t tid2); //返回0,不相等
前面提到线程共享资源,那么多个线程对同一资源进行处理时,必须要对数据的一致性问题进行处理。线程的函数众多,其常用的线程函数可以概况为11个。下面将根据线程创建、互斥、同步来一一介绍。
线程的创建和结束
创建
int pthread_create(pthread_t *restrict tidp,
const pthread_attr_t *restrict attr,
void *(*start_rtn)(void *), void *restrict arg)
其中tidp时传出参数,创建的线程ID存放在该内存单元; pthread_attr_t为线程属性; statr_rtn为开始地址 arg无类型指针参数。
线程终止
在Linux中,单线程可以通过3种方式退出线程,而不终止进程
1、从启动例程中返回,返回码即线程的退出码
2、被同一个进程的其他线程取消
3、调用pthread_exit
线程终止的两个函数
void pthread_exit(void *rval_ptr);
int pthread_join(pthread_t thread, void **rval_ptr)
线程不同返回值的区别:
当调用return时,主线程直接退出,子线程不会执行;
调用pthread_exit时,主线程结束,子线程会继续运行,所有线程结束,进程才会结束
而pthread_join自动把线程置于分离状态,可以获取线程的退出码,并且能够等待进程的终止
线程互斥——互斥量
线程的互斥,确保同一时间只有一个线程访问数据。互斥量(mutex)实质上是一把锁,访问共享资源时对其加锁,访问完后进行释放。
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
int pthread_mutex_destroy(pthread_mutex_t *mutex);
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
着五个API常用的为前面四个,也比较好理解,即对mutex互斥量进行加锁。而trylock是尝试进行加锁,不会造成阻塞。
线程同步——条件变量
条件变量是线程的一种同步机制,常与互斥量一起使用,允许线程以无竞争的方式等待特定条件的发生。如生产者消费者模型。
int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);
int pthread_cond_destroy(pthread_cond_t *cond);
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
int pthread_cond_signal(pthread_cond_t *cond);
int pthread_cond_broadcast(pthread_cond_t *cond);
pthread_cond_wait:对mutex锁进行释放,等待条件变量cond满足条件;满足条件后自动对mutex加锁
pthread_cond_signal:对条件cond进行通知
以上11个是常用的线程相关API,其中线程创建和终止2个,线程互斥4个,线程同步5个。