LINUX_C 线程总结(二)
话不多说,我们先来看一段代码
/*************************************************************************
> File Name: condition.c
> Author:九五二七
> Mail:
> Created Time: 2017年08月02日 星期三 07时59分08秒
************************************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
pthread_mutex_t mutex; //静态
pthread_cond_t cond;
void *thread1(void *arg)
{
pthread_cleanup_push ((void *) pthread_mutex_unlock, &mutex); //pthread mutex unlock 为指定函数
while (1){
printf ("thread1 is running \n");
pthread_mutex_unlock (&mutex);// 这个mutex主要是用来保证pthread_cond_wait的并发性
pthread_cond_wait (&cond , &mutex);// pthread_cond_wait会先解除之前的pthread_mutex_lock锁定的mtx,然后阻塞在等待对列里休眠,直到再次被唤醒(大多数情况下是等待的条件成立而被唤醒,唤醒后,该进程会先锁定先pthread_mutex_lock(&mtx);,再读取资源, 用这个流程是比较清楚的/*block-->unlock-->wait() return-->lock*/
printf ("thread1 applied the condition\n ");
pthread_mutex_unlock (&mutex);
sleep(4);
}
pthread_cleanup_pop(0); //当执行到这一步时返回 push 释放指定资源
}
void *thread2(void *arg)
{
while (1){
printf ("thread2 is running \n");
pthread_mutex_unlock (&mutex);
pthread_cond_wait (&cond , &mutex);
printf ("thread2 applied the condition\n ");
pthread_mutex_unlock (&mutex);
sleep(1);
}
}
int main(){
pthread_t tid1,tid2;
printf("condition variable study !\n");
pthread_mutex_init (&mutex, NULL);//锁的初始化
pthread_cond_init (&cond , NULL); //条件变量的初始化
pthread_create (&tid1, NULL, (void *)thread1, NULL);//实践证明线程1与线程2无特定先后顺序
pthread_create (&tid2, NULL, (void *)thread2, NULL);
do{
pthread_cond_signal(&cond); // 用于激活条件变量 并发出信号 由wait所指定的变量来接收
} while (1);
sleep(50);
pthread_exit(0);
}
这里用到了锁和条件变量这两种手段
加锁和解锁
#include <pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
用此函数起作用可以相当于一个宏观上的原子操作
即假如有一个变量需要操作lock会进行阻塞第二线程不会对此变量进行操作,即可以在宏观上可以看做是一个原子操作
锁用完是需要清除的
条件变量
等待天剑变量的成立
“““
int pthread_cond_timedwait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex,const struct timespec *restrict abstime);
int pthread_cond_wait(pthread_cond_t *restrict cond,pthread_mutex_t *restrict mutex);
>.激活条件变量