pthread_cond 第三方库的线程同步机制

2024-06-02 06:58

本文主要是介绍pthread_cond 第三方库的线程同步机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pthread_cond
条件变量 pthread_cond, 另外一种线程间的同步机制。普通的 mutex 只允许一个线程进入临界区,就是拿到mutex这把锁的线程,而cond 允许多个线程同时进入临界区,由它来控制,在某些条件成立的时候,来唤醒其中一个等待着的线程,或者是唤醒所有等待着的线程。

int pthread_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex);
int pthread_cond_timewait(pthread_cond_t* cond, pthread_mutex_t* mutex, const struct timespec* tout)

传递给pthrad_cond_wait 的互斥量 mutex 对条件进行保护,调用者把锁住的互斥量传递给pthread_cond_wait 函数,函数把调用线程放到等待条件的线程列表里面,然后对互斥量解锁,当pthread_cond_wait 返回的时候,互斥量再次被锁住。函数 pthread_cond_timewait 与 pthread_cond_wait 差不多,只不过是多了一个超时时间的限制。
两个函数调用成功返回的时候,需要重新检查条件,因为其他线程可能更改了条件。

int pthread_cond_signal(pthread_cond_t* cond);
int pthread_cond_broadcast(pthread_cond_t* cond);

pthread_cond_signal 函数将唤醒等待该条件的某个线程,pthread_cond_broadcast 将唤醒等待改条件的所有线程。

下面的例子很简单的使用了 cond 。 使用cond 我们可以比较高效的写出一个 线程池。

 
 1 #include <pthread.h>
 2 #include <unistd.h>
 3 #include <stdio.h>
 4 pthread_mutex_t mutex;
 5 pthread_cond_t cond;
 6  int val = 0;
 7  void *thread_zero_run( void *arg){
 8    while( true){
 9     pthread_mutex_lock(&mutex);  //  lock the mutex
10       while(val <= 2){  // condition.  use while for double check
11        printf("thread_zero_run --> val:%d, wait for wake up\n", val);
12       pthread_cond_wait(&cond, &mutex); // call pthread_cond_wait
13      }
14     printf("therad_zero_run --> val:%d, zero it and unlock\n", val);
15     val = 0;  // do  sth
16      pthread_mutex_unlock(&mutex);  // unlock the mutex
17    }
18   pthread_exit(( void*)0);
19 }
20  void *thread_add_run( void *arg){
21    while( true){
22     pthread_mutex_lock(&mutex);  // lock the mutex
23      ++val;  // do sth
24      pthread_mutex_unlock(&mutex);  // unlock the mutex
25      pthread_cond_signal(&cond);  // wake up a therad whick is waiting for the cond
26      printf("after add val:%d and wake up one zero thread for check\n", val);
27     sleep(1);
28   }
29   pthread_exit(( void*)0);
30 }
31  int main(){
32   pthread_t t_add, t_zero;
33   pthread_cond_init(&cond, NULL);
34    if(pthread_create(&t_add, NULL, thread_add_run, NULL)){
35      return 0;
36   }
37    if(pthread_create(&t_zero, NULL, thread_zero_run, NULL)){
38      return 0;
39   }
40   pthread_join(t_add, NULL);
41   pthread_join(t_zero, NULL);
42    return 0;
43 }
44       

这篇关于pthread_cond 第三方库的线程同步机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1023256

相关文章

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

SpringKafka错误处理(重试机制与死信队列)

《SpringKafka错误处理(重试机制与死信队列)》SpringKafka提供了全面的错误处理机制,通过灵活的重试策略和死信队列处理,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录引言一、Spring Kafka错误处理基础二、配置重试机制三、死信队列实现四、特定异常的处理策略五

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录