线程
线程的概念
由于同一进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
1.文件描述符表
2.每种信号的处理方式
3.当前工作目录
4.用户id和组id
但有些资源是每个线程各有一份的:
1.线程id
2.上下文,包括各种寄存器的值、程序计数器和栈指针
3.栈空间
4.errno变量
5.信号屏蔽字
6.调度优先级
在Linux上线程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项。
线程控制
pthread_create
- 函数原型:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
pthread_t *thread
:用来接收返回的线程号
pthread_attr_t *attr
:线程属性,一般可设置为NULL
void *(*start_routine) (void *)
:入口函数指针
void *arg
:函数参数指针
返回值:成功返回0,失败返回errorno
pthread_self
- 函数原型:
pthread_t pthread_self(void);
返回值:该线程的线程号
pthread_cancel
- 功能:发送终止信号给thread线程
- 函数原型:
int pthread_cancel(pthread_t thread)
pthread_t thread
:发送终止信号的线程
返回值:如果成功则返回0,否则为非0值
pthread_exit
-
功能:退出当前线程
-
函数原型:
void pthread_exit(void *retval);
void *retval
:线程所调用函数返回值
pthread_join
-
功能:挂起等待直到该线程终止
-
函数原型:
int pthread_join(pthread_t thread, void **retval);
pthread_t thread
:线程号
void **retval
:线程所调用函数返回值,如果不感兴趣可传空
返回值:成功返回0,失败返回errorno
pthread_detach
-
功能:使线程分离,分离的线程结束后自动释放所有资源。
-
函数原型:
int pthread_detach(pthread_t thread);
pthread_t thread
:需要分离的线程
返回值:成功返回0,失败返回errorno
线程同步
锁的类型
- 互斥锁(mutex)
- 自旋锁
- 读写锁
- 条件锁
互斥锁
mutex变量
-
pthread_mutex_t mutex = PTHREAD_MUTEX_INIALIZER
-
如果mutex是静态分配的,可用上述宏定义
PTHREAD_MUTEX_INITIALIZER
来初始化,相当于用pthread_mutex_init初始化并且attr参数为NULL。
pthread_mutex_init
- 函数原型:
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutex‐attr);
-
函数功能:初始化锁且设置属性
-
pthread_mutex_t *mutex
:待初始化的锁 -
const pthread_mutexattr_t *mutex‐attr
:锁的属性。一般设置为NULL,如果要将其定义为进程之间可以持有的互斥锁,则需要传入属性对象地址。 -
返回值:成功返回0,失败返回错误号
pthread_mutex_destroy
- 函数原型:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
- 函数功能:销毁锁
-
pthread_mutex_t *mutex
:销毁锁 - 返回值:成功返回0,失败返回错误号
pthread_mutex_lock
- 函数原型:
int pthread_mutex_lock(pthread_mutex_t *mutex);
- 函数功能:阻塞等待给mutex上锁
-
pthread_mutex_t *mutex
:待上锁的锁 - 返回值:0表示成功,失败返回错误号
pthread_mutex_trylock
- 函数原型:
int pthread_mutex_trylock(pthread_mutex_t *mutex);
- 函数功能:非阻塞等待给mutex上锁
-
pthread_mutex_t *mutex
:待上锁的锁 - 返回值:0表示成功,失败返回错误号,如果是原来已上锁使用该函数会返回EBUSY。
pthread_mutex_unlock
- 函数原型:
int pthread_mutex_unlock(pthread_mutex_t *mutex);
- 函数功能:给mutex解锁
-
pthread_mutex_t *mutex
:待解锁的锁 - 返回值:0表示成功,失败返回错误号
状态对象
- 如果要将其定义为进程之间可以持有的互斥锁,则需要传入属性对象地址。
lock_attr变量
pthread_mutexattr_t lock_attr;
初始化锁状态,设置状态状态为——进程共享
pthread_mutexattr_init(&lock_attr);
pthread_mutexattr_setpshared(&lock_attr, PTHREAD_PROCESS_SHARED);
销毁锁状态
pthread_mutexattr_destroy(&lock_attr);
条件锁(条件变量)
cond变量
-
pthread_cond_t mutex = PTHREAD_COND_INIALIZER
-
如果cond是静态分配的,可用上述宏定义
PTHREAD_COND_INITIALIZER
来初始化,相当于用pthread_cond_init初始化并且attr参数为NULL。
pthread_cond_init
- 函数原型:
int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
-
函数功能:初始化锁且设置属性
-
pthread_cond_t *cond
:待初始化的锁 -
pthread_condattr_t *cond_attr
:锁的属性 -
返回值:成功返回0,失败返回错误号
pthread_cond_destroy
- 函数原型:
int pthread_cond_destroy(pthread_cond_t *cond);
- 函数功能:销毁锁
-
pthread_cond_t *cond
:销毁锁 - 返回值:成功返回0,失败返回错误号
pthread_cond_wait
- 函数原型:
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
- 函数功能:归还当前得到的互斥锁,并阻塞等待条件的发生
-
pthread_cond_t *cond
:条件变量 -
pthread_mutex_t *mutex
:锁 - 返回值:成功返回0,失败返回错误号
pthread_cond_timedwait
- 函数原型:
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
- 函数功能:和
pthread_cond_wait
类似,可以设定等待超时时间。如果超时仍未有线程幻想当前线程,就返回ETIMEDOUT
-
pthread_cond_t *cond
:条件变量 -
pthread_mutex_t *mutex
:锁 -
const struct timespec *abstime
:超时时间 - 返回值:成功返回0,失败返回错误号
pthread_cond_broadcast
- 函数原型:
int pthread_cond_broadcast(pthread_cond_t *cond);
- 函数功能:唤醒在这个条件上等待的所有线程
-
pthread_cond_t *cond
:条件变量 - 返回值:成功返回0,失败返回错误号
pthread_cond_signal
- 函数原型:
int pthread_cond_signal(pthread_cond_t *cond);
- 函数功能:唤醒在这个条件上等待的另一个线程
-
pthread_cond_t *cond
:条件变量 - 返回值:成功返回0,失败返回错误号
信号量
sem变量
sem_t sem
sem_init
- 函数原型:
int sem_init(sem_t *sem, int pshared, unsigned int value);
- 函数功能:初始化一个semaphore变量,value参数表示可用的资源数量
-
sem_t *sem
:待初始化的信号量 -
int pshared
:0表示信号量用于同一进程中的线程间同步,非0表示信号量用于进程间同步(需要挂载到共享内存中) -
unsigned int value
:可用的资源数量 - 返回值:成功返回0,失败返回错误号
sem_wait
- 函数原型:
int sem_wait(sem_t *sem);
- 函数功能:尝试获得信号量资源,如果sem值已经为0,则挂起等待。
-
sem_t *sem
:待操作的信号量 - 返回值:成功返回0,失败返回错误号
sem_trywait
- 函数原型:
int sem_trywait(sem_t *sem);
- 函数功能:尝试获得信号量资源,如果sem值已经为0,则返回
EAGAIN
。 -
sem_t *sem
:待操作的信号量 - 返回值:成功返回0,失败返回错误号
sem_timedwait
- 函数原型:
int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout);
- 函数功能:尝试获得信号量资源,如果sem值已经为0,则挂起等待指定时间,若在指定时间内扔未获得信号量,则返回
ETIMEDOUT
。 -
sem_t *sem
:待操作的信号量 -
const struct timespec *abs_timeout
:超时时间 - 返回值:成功返回0,失败返回错误号
sem_post
- 函数原型:
int sem_post(sem_t *sem);
- 函数功能:释放资源,使信号量值加一,同时唤起挂起等待的线程
-
sem_t *sem
:待操作的信号量 - 返回值:成功返回0,失败返回错误号
sem_destroy
- 函数原型:
int sem_destroy(sem_t *sem);
- 函数功能:销毁信号量
-
sem_t *sem
:待销毁的信号量 - 返回值:成功返回0,失败返回错误号