这里所指的线程是POSIX线程(简称pthread)
线程同步方式:POSIX信号量、互斥锁、条件变量
根据运行环境和调度者身份,线程可分为内核线程和用户线程
创建线程和结束线程
1 #include <pthread.h> 2 int pthread_create(pthread_t* thread, const pthread_attr_* attr, void* (*start_routine)(void*), void* arg); //创建线程 3 int pthread_exit(void* retval); //退出线程 4 5 //一个进程中的所有线程都可以调用pthread_join函数来回收其他线程,即等待其他线程结束 6 int pthread_join(pthread_t thread, void** retval); 7 8 9 //有时候我们希望异常终止一个线程,即取消线程 10 int pthread_cancel(pthread_t thread); 11 12 //目标线程可以决定是否允许被取消以及如何取消,这分别由如下两个函数完成: 13 int pthread_setcancelstate(int state, int* oldstate); 14 int pthread_setcanceltype(int type, int* oldtype);
线程属性
pthread_attr_t 结构体定义了一套完整的线程属性
#include <bits/pthreadtypes.h> #define __SIZEOF_PTHREAD_ATTR_T 36 typedef union{ char __size[__SIZEOF_PTHREAD_ATTR_T]; long int __align; }pthread_attr_t;
POSIX信号量
互斥锁
#include <pthread.h> int pthread_mutex_init(pthread_mutex_t* mutex, const pthread_mutexattr_t* mutexattr); int pthread_mutex_destroy(pthread_mutex_t* mutex); int pthread_mutex_lock(pthread_mutex_t* mutex); int pthread_mutex_trylock(pthread_mutex_t* mutex); int pthread_mutex_unlock(pthread_mutex_t* mutex);
条件变量
线程间同步共享数据的值,条件变量提供了一种线程间的通知机制:当某个共享数据达到某个值的时候,唤醒等待这个共享数据的线程
1 int pthread_cond_init(pthread_cond_t* cond, const pthread_condattr_t* cond_attr); 2 int pthread_cond_destroy(pthread_cond_t* cond); 3 int pthread_cond_broadcast(pthread_cond_t* cond); 4 int pthread_cond_signal(pthread_cond_t* cond); 5 int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);
多线程环境
可重入函数:如果一个函数能被多个线程同时调用且不发生竞态条件,则我们称它是线程安全的,或说它是可重入函数。linux库函数只有一小部分是不可重入的。这些库函数之所以不可重入,主要是因为其内部使用了静态变量。不可重入库函数的可重入版本是在原函数名尾部加上 _r。