首页 > 其他分享 >多线程(2)-线程同步条件变量

多线程(2)-线程同步条件变量

时间:2024-04-04 09:14:38浏览次数:18  
标签:同步 变量 条件 cond mutex pthread 线程 多线程

在 Linux 多线程编程中,条件变量是一种用于线程间同步的重要机制。它通常与互斥锁结合使用,用于解决多个线程竞争共享资源的问题。条件变量允许一个线程在等待某个条件变为真时阻塞,并且在另一个线程改变条件并通知时恢复执行。这个玩意跟内核等待队列差不多意思。   在 Linux 多线程编程中,使用条件变量进行线程同步通常涉及以下几个相关的函数:

pthread_cond_init: 该函数用于初始化条件变量。
原型为 int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr)。
参数 cond 是要初始化的条件变量,attr 是条件变量的属性,通常为 NULL。

pthread_cond_destroy: 用于销毁条件变量。
原型为 int pthread_cond_destroy(pthread_cond_t *cond)。
参数 cond 是要销毁的条件变量。

pthread_cond_wait: 该函数用于等待条件变量的状态发生变化。
原型为 int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)。
参数 cond 是要等待的条件变量,mutex 是与条件变量配合使用的互斥锁。在调用该函数时,线程会释放互斥锁并阻塞,直到条件变量被其他线程发出信号唤醒。

pthread_cond_timedwait: 类似于 pthread_cond_wait,但是可以设置超时时间,防止永久等待。
原型为 int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex, const struct timespec *abstime)。

pthread_cond_signal: 该函数用于发送信号给等待条件变量的一个线程。
原型为 int pthread_cond_signal(pthread_cond_t *cond)。调用该函数会唤醒等待队列中的一个线程。

pthread_cond_broadcast: 类似于 pthread_cond_signal,但会唤醒等待队列中的所有线程。
原型为 int pthread_cond_broadcast(pthread_cond_t *cond)。
 

条件变量demo:

在此demo中,有一个生产者线程和一个消费者线程,它们共享一个整数变量 shared_data。生产者线程周期性地增加 shared_data 的值,而消费者线程在 shared_data 不为零时消费一个数据。生产者在生产了一个数据后会发送信号通知消费者线程,消费者在消费数据时需要先检查条件是否满足,如果不满足,则等待条件变为真。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int shared_data = 0;

void* producer(void* arg) {
    while (1) {
        pthread_mutex_lock(&mutex);
        shared_data++; // 生产一个数据
        printf("Produced: %d\n", shared_data);
        pthread_cond_signal(&cond); // 发送信号通知消费者
        pthread_mutex_unlock(&mutex);
        sleep(1); // 生产者休眠1秒
    }
    return NULL;
}

void* consumer(void* arg) {
    while (1) {
        pthread_mutex_lock(&mutex);
        while (shared_data == 0) { // 等待条件变为真
            pthread_cond_wait(&cond, &mutex);
        }
        printf("Consumed: %d\n", shared_data);
        shared_data--; // 消费一个数据
        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}

int main() {
    pthread_t producer_thread, consumer_thread;
    pthread_create(&producer_thread, NULL, producer, NULL);
    pthread_create(&consumer_thread, NULL, consumer, NULL);
    pthread_join(producer_thread, NULL);
    pthread_join(consumer_thread, NULL);
    return 0;
}
 

条件变量demo执行结果:

0            

标签:同步,变量,条件,cond,mutex,pthread,线程,多线程
From: https://www.cnblogs.com/lethe1203/p/18113887

相关文章

  • 简易线程池实现
    程序中,频繁地调用pthread_create函数创建线程,非常浪费时间,尤其在服务器端的时候,多线程的使用情况下频繁启用线程和释放线程资源,这样也会影响程序的运行效率。可以先在服务器空闲的时候先创建多个线程,我们先在线程函数里面使用pthread_cond_wait将其休眠,有任务过来的时候使用pthre......
  • 安全访问多线程环境:掌握 Java 并发集合的使用技巧
    哈喽,各位小伙伴们,你们好呀,我是喵手。  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把......
  • “码中谜“ ConcurrentHashMap线程安全机制的弹指一挥间
    引言:ConcurrentHashMap是Java中解决并发编程问题的重要工具。它提供了线程安全的HashMap实现,并能在多线程环境下保持高性能。本文将深入ConcurrentHashMap的实现,解析其线程安全机制,并提供相关代码示例。详解ConcurrentHashMap的数据结构:ConcurrentHashMap在Java中是通过......
  • Jmeter线程组-上
    线程组线程组作为JMeter测试计划的核心组件之一,对于模拟并发用户的行为至关重要。线程组元件是整个测试计划的入口,所有的取样器和控制器必须放置在线程组下。可以将线程组视为一个虚拟用户池,其中每个线程可被理解为一个虚拟用户,多个虚拟用户同时执行相同的一批任务。在这个虚拟......
  • C++自用小轮子——线程安全队列
    目录简介线程安全队列简介记录开发时自用的小轮子:线程安全队列线程安全队列#ifndefTHREADSAFEQUEUE_H#defineTHREADSAFEQUEUE_H#include<iostream>#include<queue>#include<mutex>#include<condition_variable>#include<memory>template<typenameT>cl......
  • 进程、线程和进程间的通信
    技术笔记!前言一、概念1.程序:存放在磁盘上的指令和数据的有序集合(文件),静态的。2.进程:执行一个程序所分配的资源的总称;进程是程序的一次执行过程;        动态的,包括创建、调度、执行和消亡;3.进程和程序内容区别:BSS段:通常是指用来存放程序中未初始化的......
  • 【Linux】服务器时间ntp同步(chrony)
    一、简介Chrony是一个开源自由的网络时间协议NTP的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP)同步,因此让你的计算机保持精确的时间,Chrony也可以作为服务端软件为其他计算机提供时间同步服务。Chrony由两个程序组成,分别是chronyd和chronycchronyd是一个......
  • Csharp线程
    CSharpe线程目录CSharpe线程C#如何操作线程Thread1.Thread如何开启一个线程呢?2.Thread中常见的API3.thread的扩展封装threadpool一、.NETFramework2.0时代:出现了一个线程池ThreadPool二、线程池如何申请一个线程呢?三、线程等待四、线程池如何控制线程数量Task一、Task开启线......
  • 线程间通信之wait和notify
    synchronized解释:java语言的一个关键字作用:实现同步机制,控制多线程的访问,确保同一时刻只有一个线程可以进入临界区执行同步代码。用法:加在代码块上、加在方法上、加在一个对象,原理:不管是那种用法,都会有一个对象(指定的对象、class的实例对象、class对象),这个对象又会一一对应一......
  • 多线程的案例
    目录1.单例模式1.1饿汉模式1.2懒汉模式-单线程版1.3懒汉模式-多线程版1.3懒汉模式-多线程版(改进)2.阻塞队列2.1阻塞队列是什么2.2生产者消费模型2.3标准库中的阻塞队列2.4阻塞队列实现3.定时器3.1定时器是什么3.2标准库中的定时器3.3实现定时器4.线程池4.1线......