首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么MinGW中仍然没有std::thread、std::promise和std::future?win32中的promise和futures的替代方案是什么?

MinGW是一个在Windows平台上使用的轻量级GNU编程工具集,它提供了一些类似于Linux环境的编译器和工具。然而,MinGW当前的实现并不完全支持C++11或更高版本的标准库。因此,在MinGW中仍然没有std::thread、std::promise和std::future这些C++11标准库中的多线程相关的类和模板。

在Win32中,我们可以使用Windows API提供的替代方案来实现类似的功能。具体而言,我们可以使用Win32线程函数、事件对象和回调函数来创建和管理线程,并使用Windows API提供的同步对象(如事件、互斥量和临界区)来实现线程间的同步与通信。

对于std::thread的替代方案,可以使用CreateThread函数创建新线程。CreateThread函数的详细信息可以在以下链接中找到: https://docs.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-createthread

对于std::promise和std::future的替代方案,可以使用Windows API提供的事件对象和回调函数来实现类似的功能。例如,可以使用CreateEvent函数创建事件对象,并使用WaitForSingleObject函数或WaitForMultipleObjects函数来等待事件对象的触发。此外,可以使用RegisterWaitForSingleObject函数或RegisterWaitForSingleObjectEx函数来注册回调函数,以在事件对象触发时异步执行相应的操作。

需要注意的是,使用Win32 API进行多线程编程可能更加底层和繁琐,需要手动管理线程和同步对象的生命周期和状态。因此,在开发中可能需要更多的注意事项和错误处理,以确保线程安全和正确性。

推荐的腾讯云相关产品:

  1. 云服务器(CVM):用于创建和管理云上的虚拟服务器。 链接:https://cloud.tencent.com/product/cvm
  2. 弹性容器实例(Elastic Container Instance,ECI):用于快速部署和管理容器化应用。 链接:https://cloud.tencent.com/product/eci
  3. 云数据库 MySQL 版(TencentDB for MySQL):提供高性能、可扩展的云数据库服务。 链接:https://cloud.tencent.com/product/cdb_mysql

请注意,以上仅为示例产品,腾讯云还提供了广泛的云计算产品和服务,可根据具体需求进行选择和使用。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++ 异步编程脉络与示例

本文将系统地探讨 C++ 异步编程发展历程,从早期回调方法,到 std::future std::promise,再到现代协程(coroutines),全面解析各个阶段特点使用方法。...Futures Promises 引入背景 C++11 引入了 std::future std::promise,为异步编程提供了更结构化工具。...缺点: 仍然存在一定复杂性,特别是在处理多个异步任务时。 需要显式地管理 std::future std::promise 对象。...} std::promise std::future 是一对可以配合使用工具。...每一种方式都有其优缺点,理解这些不同异步编程范式,有助于在实际开发中选择最合适解决方案。通过不断学习实践,我们可以更好地应对复杂异步编程挑战,为用户提供更高效、更可靠程序。

14410

Chapter 7: The Concurrency API

Make std::threads unjoinable on all paths 一个thread对象如果在析构时仍然是joinable,那么会使得程序终止运行 每个std::thread对象状态要么是...对于joinable线程,析构时析构函数通过detach断开了std::thread对象底层执行线程连接后,底层线程仍然在运行,此时thread所在函数占用内存已经回收,如果后面仍有函数调用的话...Be aware of varying thread handle destructor behavior 一个non-deferredstd::future一个joinablestd::thread...因为调用者future被调用者promise在传递结果时,这个结果既没有存放在promise,也没有存放在future,而是存放在一个堆对象代表shared state,而标准没有指定个对象行为...,此时线程间通信最佳方式是什么呢?

90250
  • libcopp对C++20协程接入接口设计

    而 callable_future task_future 相似度比较高,都会管理协程promise,那么我们为什么要把他们拆分成两个接口呢...显然我们并不希望每次有唤醒都去检查一次哪些任务完成了,哪些仍然要等待,这不但会有惊群效应,还会有很多冗余重置 caller 重新设置 caller 行为。...接入过程易踩坑点 首先,在 《libcopp接入C++20 Coroutine一些过渡期设计》 里提到 GCC 在MinGW环境下链接符号问题 在当前 GCC 12 已经修复了, GCC...(特别是 task_future generator_future 里 awaitablepromise对象之间交互时对 context 传递,一定是在单线程内。)...但是在 C++20 无栈协程,需要层层传递,层层创建。我预估整体开销应该是比之前使用有栈协程方案。前面提到编译器优化可以优化掉堆分配,但是协程本身开销并没有省去。

    65720

    跟面试官刚同步异步编程,有她完全够用了

    lambda函数fun 输出线程id一个传入字符串 分别在新起线程当前线程调用他 auto fun = [](std::string a, std::mutex & lock) {...//使用mutex原因 两个线程都需要通过全局对象 std::cout来输出到屏幕 如果没有mutex 会打乱id字符串输出顺序 std::unique_lock...有没有更高效方式? 共享变量,函数参数返回值三种,更高效那就 future promise 吧 7,既然你提到了 future promise,你能说说他们是如何工作吗?...有线程12,线程1希望从线程2获取特定值,步骤如下: 线程1:创建promise对象,并从该对象获得对应future对象-> ->线程1将promise对象传递给线程...所以,我们可以使用std::async替代线程创建,让它成为我们做异步操作首选。

    54520

    C++并发编程 - 同步并发操作

    在C++标准库, 有两种“期望”, 使用两种类型模板实现, 声明在头文件: 唯一期望(uniquefutures)( std::future )共享期望(shared futures)( std...即std::async、std::packaged_taskstd::promise会返回std::future类型,线程通过std::future获取任务执行结果。  ...std::promises 承诺与期望 std::promise对象可以保存某一类型 T 值,该值可被 future 对象读取(可能在另外一个线程),因此 promise 也提供了一种线程同步手段...在 promise 对象构造时可以一个共享状态(通常是std::future)相关联,并可以在相关联共享状态(std::future)上保存一个类型为 T 值。 ...针对std::async可能引发问题,告诫程序员们,一定要规范使用每一个接口,缺省参数及返回值不处理的话可能让代码裂成“东非大裂谷”。把接口参数返回值,不管有没有必要,都要处理。

    1.1K40

    C++并发低级接口:std::threadstd::promise

    std::threadstd::promise 相比std::async,std::thread就原始多了。...虽然std::thread.detach()可以不阻塞主线程,但是如果主线程结束那这些后台任务都会强行终止,比如你后台是下载任务,所以几乎没有直接用detach,都是配合后面的同步机制如std::condition_variable...这里也凸显了std::async高级std::thread低级:在std::async我们可以对它返回值即std::future简单调用get()实现同步等待甚至能获取任务结果,但是std...多说一点,其实std::promisestd::future都是多线程状态共享方案,这两种不存在高级低级,只有std::asyncstd::thread有点高级低级之分。...不过《C++标准库》这样分类,加之std::future,std::promise分别用于std::asyncstd::thread示例,我也只能照做了;)

    2.3K40

    【Example】C++ 标准库多线程同步及数据共享 (std::futurestd::promise)

    在任何语言多线程编程当中,必然涉及线程同步及数据共享,方式也有很多种。 C++ 标准库当中提供了同步及共享方案std::futurestd::promise 。...【语法】【伪代码】std::future name(promise.get_future()); 【负责存储】std::promise 也是一个模板类,它提供了存储异步执行异常一种方式...4,std::promise 在作为使用者异步线程当中,应当注意共享变量生命周期、是否被 set 问题。如果没有共享值没有被 set,而异步线程却结束,future 端会抛出异常。...std::shared_future 与 std::packaged_task std::future 有个非常明显问题,就是只能一个 std::promise 成对绑定使用,也就意味着仅限于两个线程之间使用...若 policy 设置了 std::launch::async  std::launch::deferred 两个标志,则进行异步执行还是惰性求值取决于实现。

    1.5K30

    再也不用std::thread编写多线程了

    ::futurestd::shared_future * *基于任务std::async 基于线程std::thread */ int sys = 1; int doAsyncWork()...以等待它期望,该wait调用会阻塞反应任务到 * std::promise型别对象被设置为止 * * 2,发生端std::promise,接收端 std::futurestd::shared_future...:promise期望值之间是共享状态,而共享状态通常是动态分配,因此,你就得假设这种设计会招致在堆上进行分配回收成本 * * 3,std::promise型别对象只能设置一次,它期望值之间通信通道是个一次性机制...* * 1,关键在 react代码中使用std::shared_futures而非std::future,前者是把共享状态所有权转移给了由share生成 * std::shared_future...* * c++98肯定会发生,无论调用方传入是什么,形参newName都会经过复制构造函数创建 * * 不过,在C++11,newName仅在传入左值时候才会被复制构造,若传入右值,会被移动构造

    2.4K40

    读 NebulaGraph源码 | 查询语句 LOOKUP 一生

    ); // 这里开始 DAG 物理计划执行 // 调度是基于 folly Promise Future 异步调用展开 return doSchedule(executor); }...也就是说,如果这个算子依赖了某些算子,只有它们许诺兑现了(promise set value),这里 future 才能得到处理 std::unordered_map<int64_t, std:...)); queue.push(root); visited.emplace(root); // 开始 DAG 访问图计算节点,生成每一个节点 promise future while...LOOKUP 语句算子在执行什么? 上面我介绍了物理算子通过 folly 三方库 Promise Future 异步编程模型来实现调度执行。...有很多细节没有展开,后续文章我们将不断展开。其实,对于任意一个语句,基本执行流程 LOOKUP 一生都类似,其中有不同地方就是额外算子不同,算子之间处理逻辑不同。

    1.5K40

    C++11异步编程(std::async, std::future, std::packaged_task, std::promise)

    future,然后通过future来获取想要得到结果。... std::promise是一个类模板,它作用是在不同线程实现数据同步,与future结合使用,也间接实现了future在不同线程间同步。...thread t(fun, 1, std::ref(p)); std::cout << fu.get() << std::endl; // 当promise没有时候在此等待...需要注意是在使用过程不能多次set_value(),也不能多次get_future()多次get(),因为一个promise对象只能一个对象相关联,否则就会抛出异常。...std::async        其实这个函数是对上面的对象一个整合,async先将可调用对象封装起来,然后将其运行结果返回到promise,这个过程就是一个面向future一个过程,最终通过future.get

    15.7K30

    【译文】Rust futures: async fnthread::sleep阻塞调用

    你已经读了这篇文章标题,可能会猜到get_bookget_music是按顺序执行。但为什么!?异步fn所有内容不是都应该同时运行吗?...为什么async不行? 我不会在这里深入讨论futuresasync/await(本书是一个很好起点)。我只想指出造成困惑两个可能根源: std::thread::sleep 会阻塞?...但是文档没有明说“此调用是阻塞,你不应该在异步上下文中使用它”,并且非系统程序员可能不会过多地考虑“将当前线程置于睡眠状态”。...你可以找到一个异步替代方案:当thread::sleep阻塞时,你可以使用它们(取决于你选择运行时生态系统): async_std::task::sleep (1.0) tokio::time::delay_for...(0.2.0) tokioasync_std都为其他阻塞操作(例如文件系统tcp流访问)提供了异步替代方法。

    3K20

    CC++开发基础——std::future与async异步编程

    std::promise也是一个类模板,可以基于std::promise实现线程之间数据传输。 构造一个std::promise对象时,可以std::future对象相互关联。...std::thread启动线程如果抛出了异常,且异常没有被线程本身处理时候,这个线程会导致整个应用程序发生终止。...std::future可以很方便地获取线程执行结果,如果线程抛出了异常,std::future可以将异常转移到另一个线程,让另一个线程来处理异常。...} } 运行结果: Caught exception: Exception throw from CalculateSum. 2.std::promisestd::future区别 同一个线程或者另一个线程将线程函数计算结果放入到...std::promise,而std::future可以获取std::promise存储线程计算结果。

    86010

    C++一分钟之-未来与承诺:std::futurestd::promise

    在现代C++编程std::futurestd::promise是异步编程模型两个重要组件,它们构成了C++标准库处理异步计算结果基础。...并发编程:在多线程环境std::promisestd::future可以用来在不同线程间传递数据,实现线程间通信。...三、常见问题与易错点3.1 异常安全当向std::promise设置值时抛出异常,如果没有妥善处理,可能会导致结果永远不会被设置,而等待std::future将永远阻塞。...3.2 多重获取std::future结果只能获取一次。尝试再次调用get()会导致未定义行为。3.3 错误线程同步在多线程环境下,没有正确同步对std::promise访问可能导致数据竞争。...通过理解std::futurestd::promise工作原理及其最佳实践,开发者能够更高效、安全地编写异步并发代码,充分利用现代硬件多核优势,提升程序性能。

    53110

    来聊聊C++中头疼线程、并发

    因为一旦主线程执行完,相应资源就被释放了。 //但是对象本身ta还在吗?不在了。那为什么thread还能正常运行?因为创建thread时创建副本在子线程运行。...线程A锁了金锁,需要去锁住银锁;然而线程B锁了银锁,需要去锁住金锁,这样AB都在等待对方释放锁。就成了死锁。 死锁一般解决方案:只要保证两个互斥量上锁顺序一致就不会死锁。...如果wait()或者get()没有调用则不会执行线程. eg: std::async(std::launch::deferred,my_thread)可以测试线程id,延迟调用,其实没有创建新线程,是在主线程调用线程入口函数...std::future fu=myprom.get_future();//promisefuture绑定,用于获取线程返回值 auto result=fu.get(); }...然而CAS过程其实没有获取释放锁。它运行JMM内存模型没有关系。

    5K41

    UNIX(多线程):12---async、future、packaged_task、promise

    "future": 将来意思,有人也称呼std::future提供了一种访问异步操作结果机制,就是说这个结果你可能没有办法马上拿到,但不久将来, 什么叫“启动一个异步任务”,就是自动创建一个线程并开始执行对应线程入口函数...std::launch::deferred: 延迟调用,并且没有创建新线程,是在主线程调用线程入口函数。 ? ?...std::promise 我们能够再某个线程给它赋值,然后我们可以再其他线程,把这个值取出来用。...::get_id() << endl; //打印主线程id std::promise var_pro; //创建一个promise对象,用来保存int类型std::thread objThread.../获取结果 objThread.join(); std::future t1 = var_pro.get_future(); //promise线程绑定,用于获取线程返回值 std::thread

    44120

    《C++并发编程实战》读书笔记(2):并发操作同步

    中提供了两种类模板futureshared_future,同一事件仅可关联一个future实例,但可关联多个shared_future,并且目标事件发生后关联所有shared_future...promise通过get_future获取关联future对象,等待数据线程在future上阻塞,提供数据线程通过set_value设置数据,设置完后future即就绪。...(true); } } } } async与packaged_task运行函数抛出异常时会保存在future对象,调用get时再次抛出。...std::chrono库时钟是时间信息来源,每个时钟类都提供当前时刻now、时间值类型time_point、计时单元长度ratio、计时速率是否恒定is_steady。...C++20还提出两个新特性:latchbarrier。latch是一个同步对象,内含计数器,减到0时就绪。

    36720

    【C++11】 让多线程开发变得简单--异步操作

    C++ 11提供了异步操作相关类函数,不同类具备不同功能,总体来说类主要有:std::future,std::promise,std::package_task,函数主要是std::async。...1 异步操作类 上面三个类主要功能是: std::future:该类主要作为异步结果传输通道,方便获取线程函数返回值; std::promise:用来包装一个值,futre绑定使用,方便线程赋值;...1.1 std::futurethread库中提供了该future访问异步操作结果,由于异步结果不能马上取得,只能在未来某个时候进行获取,这个结果是一个未来值,因此叫做future。...= std::future_status::ready); 1.2 std::promise 使用std::promise可以实现在两个不同线程之间数值传递。...0; } 程序运行结果为:iRes=5 2 异步操作函数:async 相对前面的异步操作类,std::async要高级多,且可以直接创建异步task类,异步返回结果保存在future,在获取线程函数返回结果时

    70630
    领券