首页 > 其他分享 ><future>和<condition_variable>的区别

<future>和<condition_variable>的区别

时间:2024-05-22 10:57:22浏览次数:7  
标签:std 区别 future 线程 variable include condition

std::futurestd::condition_variable 都是C++标准库中用于处理并发编程的工具,但它们有不同的用途和工作方式。以下是对两者的详细比较和各自的使用示例。

std::future

std::future 提供了一种机制,用于访问异步操作的结果。它通常与 std::promisestd::async 一起使用。

  • 用途:用于异步操作的结果传递和获取。
  • 工作方式:一个线程可以通过 std::future 等待另一个线程完成某个任务,并获取其结果。
  • 典型使用场景:一个线程执行异步操作(如计算任务、IO操作),另一个线程等待该操作的结果。

示例

#include <iostream>
#include <future>
#include <thread>
#include <chrono>

int computeValue() {
    std::this_thread::sleep_for(std::chrono::seconds(2));  // 模拟耗时操作
    return 42;
}

int main() {
    // 使用 std::async 启动异步任务
    std::future<int> fut = std::async(std::launch::async, computeValue);

    std::cout << "Waiting for the result...\n";
    int result = fut.get();  // 阻塞等待结果
    std::cout << "Result is: " << result << std::endl;

    return 0;
}

std::condition_variable

std::condition_variable 是一种同步原语,允许线程在某些条件满足前阻塞等待。通常与互斥锁(std::mutex)一起使用。

  • 用途:用于线程间的同步,确保某些条件满足时才继续执行。
  • 工作方式:一个线程等待某个条件,另一个线程在条件满足时通知等待的线程。
  • 典型使用场景:一个线程等待某个资源可用,另一个线程在资源准备好时通知它。

示例

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void print_id(int id) {
    std::unique_lock<std::mutex> lck(mtx);
    while (!ready) cv.wait(lck);  // 等待 ready 为 true
    // 当 ready 为 true 时,继续执行
    std::cout << "Thread " << id << '\n';
}

void go() {
    std::unique_lock<std::mutex> lck(mtx);
    ready = true;
    cv.notify_all();  // 通知所有等待的线程
}

int main() {
    std::thread threads[10];
    for (int i = 0; i < 10; ++i)
        threads[i] = std::thread(print_id, i);

    std::cout << "10 threads ready to race...\n";
    std::this_thread::sleep_for(std::chrono::seconds(1));
    go();  // 改变 ready 并通知所有线程

    for (auto& th : threads) th.join();
    return 0;
}

主要区别

  • 功能

    • std::future 用于异步任务的结果传递。
    • std::condition_variable 用于线程间的同步。
  • 使用模式

    • std::future 通过 std::promise 设置结果,或者通过 std::async 启动异步任务,并通过 future 获取结果。
    • std::condition_variable 需要与 std::mutex 一起使用,一个线程等待条件变量,另一个线程通知条件变量。
  • 同步机制

    • std::future 是一种高级同步机制,主要关注结果的传递和获取。
    • std::condition_variable 是一种低级同步原语,主要关注线程间的协调。

适用场景

  • 使用 std::future 的场景

    • 需要在线程间传递计算结果。
    • 需要启动并等待异步任务的完成。
  • 使用 std::condition_variable 的场景

    • 需要在某些条件满足时通知一个或多个线程继续执行。
    • 需要实现复杂的线程间同步逻辑。

总结来说,std::futurestd::condition_variable 在并发编程中各有其独特的用途和优势,选择哪一个取决于具体的应用场景和需求。

标签:std,区别,future,线程,variable,include,condition
From: https://www.cnblogs.com/whcjob/p/18205767

相关文章

  • 允许鼠标响应 css,pointer-events: auto; 和 pointer-events: all; 有什么区别,用哪个
    在CSS中,`pointer-events:auto;`和`pointer-events:all;`实际上并不存在`pointer-events:all;`这个值,因此不用考虑哪个更好。正确的用法是`pointer-events:auto;`。###`pointer-events`属性的概述`pointer-events`属性用于控制一个元素是否响应鼠标事件(如点击、悬停......
  • Debian系统与CentOS 7.X命令区别
    Debian和CentOS7.x作为两个不同的Linux发行版,它们在命令行操作上有一些显著的区别,尤其是体现在软件包管理和系统维护方面。以下是一些主要的区别:1、软件包管理Debian使用的是APT(AdvancedPackageTool)系统,常见的命令包括:更新软件包列表:sudoapt-getupdate安装......
  • KPI vs OKR:区别与联系的终极指南
    在不提及KPI和OKR的情况下,很难谈论绩效管理。但是这些缩写词代表什么呢?它们如何使您的组织受益? 关键绩效指标(KPI)KPI是一个可衡量的值,它指示组织在员工绩效,流程,产品,项目和其他计划等特定领域的表现。简而言之,它是对公司绩效的成功,状态和标准的量化度量。目标与关键成果(OKR)战略......
  • 解释下什么是面向对象?面向对象和面向过程的区别?
    面向对象(Object-OrientedProgramming,OOP)是一种编程范式,它基于“对象”的概念,将数据和操作数据的方法组织在一起。在面向对象编程中,对象是类的实例,类定义了对象的属性(数据成员)和行为(方法)。对象可以互相通信,通过调用彼此的方法来完成任务。面向对象的四个核心原则是封装、继承、......
  • Oracle和MySQL的区别
    刚进公司接触到了Oracle,记录一下他们的区别,面试的时候也有问到过,而且上来就是千万级别的数据调优,嘻嘻,我只是一个3年java。题外话,甚至有一些公司会问我java跟C、python的区别,以及具体区别的例子,然后我如果回答上来了,他们会告诉我,这边只做后端而且只用java,笑嘻了就本人最近的使用和......
  • BDD和ATDD、实例化需求有何区别?
    除了BDD之外,想必你也曾听说过ATDD和实例化需求这两个术语,那它们之间有何区别呢?要想得到问题的答案,不得不先了解下另外一个术语:TDD。TDD TDD,测试驱动开发,是由KentBeck在1999年提出的,强调测试先行,避免过度设计。TDD测试驱动开发的核心为红-绿-重构三步骤:1、编写一......
  • 外肢体与协作机器人,移动机器人,外骨骼机器人的区别
    https://chatgpt.com/share/9d4603cf-591b-474d-a33c-876297bc50b9QHowsupernumeraryroboticarmsdifferfromcollabrativerobots,mobilerobots(roboticarmsmountedonAGV)andexoskeletons?Isthereanytaskthatsupernumeraryroboticarmscando......
  • ddt数据驱动中unpack和*的区别
    分析在使用ddt导入数据的时候,会分别用到*解包和unpack,经常会把这两个认为是同一个用法,其实不是//我们定义一组CSV数据null,测试数据,存放地点名称必填,请重新输入。//数据驱动importcsvdefreadCsv():withopen("teatdata2.csv",encoding="utf-8")asf:......
  • 测试计划与测试内容的区别
    测试方案、测试计划、测试策略与测试用例之间的区别?测试方案:测试工具的设计和选择,测试用例的设计方法,测试代码的设计方案。测试方案需要在测试计划的指导下进行,测试计划提出“做什么”,而测试方案明确“如何做“。一个行动方案,一个偏执行。测试计划:1、对测试全过程的组织、资......
  • 关于一重指针和二重指针的区别和联系
    一、关键词指针,二重指针二:知识点1.指针的本身地址、指针所指向地址、指针所指向地址内容本身地址:指针也是一个类型,通常是在64位系统上是8字节,32位是4字节。既然是类型对象就需要存储地址,因此本身地址指的是用于存储指针这个变量值的地址。指针指向地址:指针是个变量,这个变......