pthread_cond_wait 常用套路

Linux 线程相关函数

  • 1、pthread_create 函数
  • 2、pthread_join 函数
  • 3、互斥锁 pthread_mutex_t 类型
  • 4、条件变量 pthread_cond_t 类型
  • 5、 pthread_cond_t 和 pthread_mutex_t 结合使用

1、pthread_create 函数

1.1 pthread_create 创建新线程

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
//参数说明:
// 1)、(传出参数) 新线程ID
// 2)、attr线程属性。NULL表使用默认属性 pthread_attr_t
// 3)、线程主函数:void *(*tfn)(void *)
// 4)、线程主函数参数

1.2. 使用例子

 pthread_t  pthread;
 pthread_create(&pthread, NULL,pthread_run, NULL);
 // pthread_run 回调函数

2、pthread_join 函数

 1. pthread_join 函数的作用  
 	等待线程运行结束退出,一般和pthread_create配对使用
 2. pthread_join(&thread, NULL);

3、互斥锁 pthread_mutex_t 类型

  1. pthread_mutex_t 类型的初始化,分为动态和静态两种
// 动态:
pthread_mutex_t lock;
pthread_mutex_init(&lock, NULL);
// 静态:
pthead_mutex_t muetx = PTHREAD_MUTEX_INITIALIZER;

2. 销毁:pthread_mutex_destroy(&lock);
3. 加锁:pthread_mutex_lock(&lock);
4. 解锁:pthread_mutex_unlock(&lock);
5. 非阻塞加锁:pthread_mutex_trylock(&lock);

4、条件变量 pthread_cond_t 类型

  1. pthread_cond_t 类型的初始化,分为动态和静态两种
// 动态:pthread_cond_t
// int pthread_cond_init(pthread_cond_t *cond, pthread_condattr_t *cond_attr);
pthread_cond_t cond;
pthread_cond_init(&cond,NULL);
// 静态:
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
  1. 退后用完需要销毁
 pthread_cond_destroy (&cond);

5、 pthread_cond_t 和 pthread_mutex_t 结合使用

  1. pthread_cond_wait
 int pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex);
pthread_cond_wait 是阻塞等待函数,它的内部结构是:

首先 pthread_cond_wait前要先加锁,其次pthread_cond_wait内部会解锁,然后等待条件变量被其它线程激活,最后pthread_cond_wait被激活后会再自动加锁

  1. pthread_cond_timedwait
int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime);
// 作用:其中计时等待方式如果在给定时刻前条件没有满足,则返回ETIMEOUT,结束等待
// 例子:
struct timespec    ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_nsec += 100*1000*1000;
ts.tv_sec  += ts.tv_nsec / 1000000000;
ts.tv_nsec %= 1000000000;
pthread_cond_timedwait(&cond, & lock, &ts);
  1. pthread_cond_signal函数

作用:唤醒(至少)一个阻塞在条件变量上的线程
使用例子:pthread_cond_signal(&cond);

  1. pthread_cond_broadcast
    唤醒全部阻塞在条件变量上的线程
  2. pthread_cond_wait 的常用套路
 // 等待线程:
pthread _mutex_lock(&mutex)
whileif(线程执行的条件是否成立)
      pthread_cond_wait(&cond, &mutex);
// 线程执行
pthread_mutex_unlock(&mutex);

// 激活线程:
pthread_mutex_lock(&mutex);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);

你可能感兴趣的:(多线程,c语言,c++)