c/c++ 多线程 多个线程等待同一个线程的一次性事件

多线程 多个线程等待一个线程的一次性事件

背景:从多个线程访问同一个std::future,也就是多个线程都在等待同一个线程的结果,这时怎么处理。

办法:由于std::future只能被调用一次get方法,也就是只能被某一个线程等待(同步)一次,不支持被多个线程等待。所以std::sharted_future,就应运而生了。

特点:std::sharted_future可以被复制,std::future是不可以的被复制的。

std::sharted_future的3种创建方式(fut为std::future):

1,std::shared_future<int> sf2(std::move(fut));

2,std::shared_future<int> sf2 = fut.share();

3,std::shared_future<int> sf1(pro.get_future());

代码:

#include <iostream>
#include <future>     

int do_get_value() { return 10; }
void th1(std::shared_future<int> sf){
  std::cout << sf.get() << std::endl;
}
void th2(std::shared_future<int> sf){
  std::cout << sf.get() << std::endl;
}
int main(){
  std::future<int> fut = std::async(do_get_value);
  //std::shared_future<int> sf2(std::move(fut));
  //std::shared_future<int> sf2 = fut.share();
  //std::thread t1(th1, sf2);
  //std::thread t2(th1, sf2);

  //t1.join();
  //t2.join();
  std::promise<int> pro;
  std::shared_future<int> sf1(pro.get_future());
  std::thread t1(th1, sf1);
  std::thread t2(th1, sf1);
  pro.set_value(110);
  t1.join();
  t2.join();
}

github源代码

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

原文地址:https://www.cnblogs.com/xiaoshiwang/p/10029493.html

时间: 2024-10-27 17:15:20

c/c++ 多线程 多个线程等待同一个线程的一次性事件的相关文章

Java多线程--让主线程等待子线程执行完毕

使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用countDownLatch.await()方法非常简单的完成主线程的等待: public class ThreadWait { public static void main(String[] args) throws InterruptedException { int threadNumber

Java Thread.join()详解--父线程等待子线程结束后再结束

目录(?)[+] 阅读目录 一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法 join是Thread类的一个方法,启动线程后直接调用,例如: ? 1 Thread t = new AThread(); t.start(); t.join(); 回到顶部 在很多情况下,主线程生成并起动了子线程,如果子线程里要进行大量的耗时的运算,主线程往往将于子线程之前结束,但是如果主线程处理完其他的事务后,需

【C/C++多线程编程之四】终止pthread线程

多线程编程之终止pthread线程  Pthread是 POSIX threads 的简称,是POSIX的线程标准.           终止线程似乎是多线程编程的最后一步,但绝不是本系列教材的结束.线程创建到线程终止,希望先给读者一个关于多线程编程的总体认识.           1.终止Pthread线程:pthread_exit()           參数:           ret:地址指针,本质上是返回值写入的地址.           终止线程是线程的主动行为,一个线程调用pth

Java 多线程(七)——线程组与线程池

1 线程组 1.1 概述 Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理.对线程组的控管理,即同时控制线程组里面的这一批线程. 用户创建的所有线程都属于指定线程组,如果没有显示指定属于哪个线程组,那么该线程就属于默认线程组(即main线程组).默认情况下,子线程和父线程处于同一个线程组. 只有在创建线程时才能指定其所在的线程组,线程运行中途不能改变它所属的线程组,也就是说线程一旦指定所在的线程组,就直到该线程结束. 线程组与线程之间结构类似于树形的结构: 1.2

Java-多线程之初识线程

1.进程与线程的区别 在我们平时使用电脑的过程中,有很多的应用,当我们运行一下应用时,这是就是一个进程开启.进程是程序执行的过程,是动态的,同时进程还是资源(内存,文件)和线程的载体.而很多程序拥有很多的功能,比如word文件,可以编辑文字,这些就是进程,相当于程序的一个任务就是一个线程. 2.线程的交互 线程的交互只要包括互斥和同步.互斥主要表现在当几个线程同时想要使用一个资源时,这时候会产生互斥:同步表现在几个线程同时完成同一个任务,比如下载文件,这时候可能需要多个线程同时进行. 3.线程的

java 多线程—— 线程等待与唤醒

java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 java 多线程—— 线程等待与唤醒 概述 第1部分 wait(), notify(), notifyAll()等方法介绍 第2部分 wait()和notify()示例 第3部分 wait(long timeout)和notify() 第4部分 wait() 和 notifyAll() 第5部分 

18、多线程 (线程安全、线程同步、等待唤醒机制、单例设计模式)

线程操作共享数据的安全问题 *A:线程操作共享数据的安全问题 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码. 程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 售票的案例 *A:售票的案例 /* - 多线程并发访问同一个数据资源 - 3个线程,对一个票资源,出售 */ public class ThreadDemo { public static void main(String[] args) { //创建Runnable接口实现

多线程ManualResetEvent、等待所有线程

需求:成员A可能有几十个,我需要更新所有的A,然后根据A的数据,去更新成员B. 解决方案:思路是想通过多线程更新所有的A,然后通过等待线程来确定所有的A是否都更新完,最后更新B. Member B = ....;//B成员的model IList<Member> list = ......;//查出所有的A成员,装进list里. ManualResetEvent[] manualEvents = new ManualResetEvent[list.Count]; //更新所有的A成员 for

多线程同步-主线程等待所有子线程完成案例

有时候我们会遇到这样的问题:做一个大的事情可以被分解为做一系列相似的小的事情,而小的事情无非就是参数上有可能不相同而已! 此时,如果不使用线程,我们势必会浪费非常多的时间来完成整个大的事情,而使用线程的话将会存在这样的问题: 主线程启动所有子线程并发执行后主线程就直接返回了,导致外部函数判读整个大的事情完成了,但是实际上并没有完成! 针对以上情况我想我会采用多线程方式执行同时解决主线程等待子线程的问题.如图: 在这里我使用Java进行案例分析. 首先建立一个线程管理类,用于启动所有子线程和等待所