线程操作
线程(thread)就是运行在进程上下文中的逻辑流。每个线程都有它自己的线程上下文(thread contxt),包括唯一的整数线程ID(Thread ID,TID)、栈、栈指针、程序计数器、通用目的的寄存器和条件码。
所有的运行在一个进程里的线程共享该进程的整个虚拟地址空间。
创建线程pthread_create
typedef void *(func)(void *); //return NULL;
int pthread_create(pthread_t *tid, pthread_attr_t *attr, func *f, void *arg); //线程id,环境属性,线程函数,传递参数
返回:成功返回0,出错返回非0。attr_t 一般为 NULL
添加线程执行pthread_join
int pthread_join(pthread_t tid, void **thread_return); //线程id,线程返回指针
返回:成功返回0,出错返回非0
退出线程pthread_exit
void pthread_exit(void *thread_return);
线程同步/互斥/临界区操作
- 信号量。无名信号量用作线程间临界区操作
- 互斥锁。信号量初始化为1时的特殊用法,互斥操作
- 自旋锁。不休眠一直循环的锁操作,用于临界区很快就可以执行完毕的情况。信号量与自旋锁会休眠等待
- 其他。读写锁,时间锁等等
信号量
信号量操作(线程间使用无名信号量,有名信号量用作进程间通信)
/*信号量定义*/
sem_t sem;
/*初始化信号量,类型为0则线程间通信,非0可以进行进程间通信*/
int sem_init(sem_t *sem, int pshared, unsigned int value); //信号量对象,信号量类型,信号量的值
@@ 成功时返回 0;错误时,返回 -1,并把 errno 设置为合适的值。
/*信号量加减操作*/
int sem_wait(sem_t *sem); //获取信号量 sem_wait是一个原子操作,它的作用是获取信号量并减一
int sem_post(sem_t *sem); //也是一个原子操作,它的作用是信号量并加一
@@ 成功时返回 0;错误时,信号量的值没有更改,-1 被返回,并设置 errno 来指明错误
sem_destroy(sem_t *sem); //销毁信号量
信号量代码示例:
#include <time.h>
#include <stdio.h>
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#