二 线程间机制
1.线程间同步
<1>同步:相互配合完成一个事情,(按照一定的顺序完成)
<2>使用的机制:信号量
信号量代表一类资源,信号量的值是资源的个数
<3>描述信号量 sem_t
例如:
定义一个信号量,代表一类资源
sem_t rsem;
sem_t wsem;
<4>信号量的操作
(1)初始化信号量
int sem_init(sem_t *sem, int pshared, unsigned int value);
参数:
@sem 信号量变量的地址
@pshared 0:线程间使用 非0:进程间使用
@value 初始化的信号量值
返回值:
成功返回0,失败返回-1
(2)P操作:申请资源
int sem_wait(sem_t *sem);
参数:
@sem 信号量
返回值:
成功返回0,失败返回-1
(3)V操作:释放资源
int sem_post(sem_t *sem);
参数:
@sem 信号量
返回值:
成功返回0,失败返回-1
2.线程间互斥机制
互斥:同一时刻只能有一个人访问[有你没我]
临界资源:这种资源同一个时刻只能有一个人访问,如果多个人访问就会导致结果不对,对于临界资源需要加互斥琐保护
<1>定义互斥琐
pthread_mutex_t lock;
<2>初始化互斥琐
//静态初始化
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
//动态初始化
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
参数:
@mutex 互斥琐
@attr NULL:默认的属性
<3>获得琐
int pthread_mutex_lock(pthread_mutex_t *mutex);
获得互斥琐,如果没有获得互斥琐则阻塞
int pthread_mutex_trylock(pthread_mutex_t *mutex);
获得互斥琐,如果没有获得互斥琐则立即返回
<4>释放琐
int pthread_mutex_unlock(pthread_mutex_t *mutex);
思考:如何使用互斥琐?
获得互斥琐 -> 访问临界资源 -> 释放互斥琐
练习:
全局数组
char global_buf[1024];
A线程向数组中输入数据,B线程输出数组内容
------------------------------------------------------------------------------------------------------
3.异步通知
使用机制:条件变量
<1>定义一个条件变量
pthread_cond_t cond;
<2>初始化条件变量
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);
<3>让线程等待指定的条件
int pthread_cond_wait(pthread_cond_t *cond,pthread_mutex_t *mutex);
特点:
如果等待的条件不满足,释放琐,然后阻塞
如果等待的条件满足[被别的线程唤醒],先获得琐,然后返回
<3>唤醒等待的线程
//唤醒所有等待条件的线程
int pthread_cond_broadcast(pthread_cond_t *cond);
//唤醒第一个等待条件的线程
int pthread_cond_signal(pthread_cond_t *cond);
注意:被唤醒的线程一定要处于等待态
三 ctags工具查找结构体定义,宏,函数申明
<1>ctags生成tags文件
[1]ctags -R 递归当前的目录,建立索引文件
[2]tags -I __THROW -I __THROWNL -I __nonnull -R --c-kinds=+p --fields=+iaS --extra=+q (信息更完全)
<2>查找
vi -t 结构体名/宏/函数申明/类型
注意:
默认只会在当前目录下的tags文件中搜索
我们可以设置tags环境变量,添加我们tags的路径
在用户主目录下的.vimrc配置文件中,添加tags环境变量
<3>跳转
ctrl + ] / ctrl + t
2015/04/21 13:06