在非std :: thread上使用std :: future和std :: promise是否安全?

时间:2018-12-19 07:08:03

标签: c++ multithreading c++11

我特别想将它们与boost::asio::thread pool一起使用。乍一看似乎可行,但我对此表示怀疑。

为澄清起见: 我知道std::thread是基于boost :: thread的,但是asio::thread_pool使用它自己的线程实现是出于对我不明显的某些原因。

我使用std::futurestd::promise进行用户代码中断和完成状态的线程间信令。

3 个答案:

答案 0 :(得分:2)

您在问题中提到的所有“线程”实现都是同一对象的 models :目标操作系统的线程。

只要填充std::promise的代码最终可以到达那里,您就可以等待std::future。对于这两个无关紧要,它们是如何启动的操作系统线程是如何启动的。

答案 1 :(得分:0)

std::thread重载,基于boost版本:因此可以100%使用。

通常,它应该与所有其他版本的线程一起使用。 futurepromise因内存模型而起作用,线程的实际实现对其并不重要。

我能想象的唯一问题是诺言没有正确地传递到线程中,但这只是一些编码错误,每次都会导致失败。

答案 2 :(得分:0)

我不知道我们是否可以自己确定地回答这个问题,所以让我们看看使用Boost和标准库的专家不得不说。

曾是Boost Thread库的主要开发者和维护者的Anthony Williams在他的书"C++ Concurrency in Action"C++ Definitive Books list中的其中一本书)中说了这一点:

  

Boost Thread库提供了基于C ++ 11标准的API   线程库建议书,可移植到许多平台。大多数例子   可以明智地修改本书中的内容以使其与Boost Thread Library一起使用   将std::替换为boost::,并使用适当的#include指令。   有一些设施不被支持(例如std::async)或具有   Boost Thread库中的其他名称(例如boost::unique_future)。

     

新的C ++线程库很大程度上基于先前积累的经验   通过使用前面提到的C ++类库。尤其是,   Boost线程库已用作新模型的主要模型   库是基于库的,许多类与它们共享名称和结构   Boost对应的随着新标准的发展,这已经成为   双向流,Boost Thread Library本身也进行了更改以匹配C ++   在很多方面都是标准的,因此从Boost过渡的用户应该会发现自己   非常在家。