- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Bjarne Stroustrup在他的书《 C++编程语言》(第4版)的“教程”第5.3.5.3章中,写了std::async
函数。
There is an obvious limitation: Don't even think of using
async()
for tasks that share resources needing locking – withasync()
you don't even know how manythread
s will be used because that's up toasync()
to decide based on what it knows about the system resources available at the time of a call.
“Simple” is the most important aspect of the
async()
/future
design; futures can also be used with threads in general, but don't even think of usingasync()
to launch tasks that do I/O, manipulates mutexes, or in other ways interact with other tasks.
A simple and realistic use of
async()
would be to spawn a task to collect input from a user.
async
on cppreference.com
完全没有提及任何此类限制。
async
很晚才被纳入C++ 11标准中,并且存在一个很多讨论该功能应该有多强大。特别是,我发现
Async Tasks in C++11: Not Quite There Yet by Bartosz Milewski文章很好地总结了实现
async
时必须考虑的问题。
thread_local
变量有关,如果线程被回收,这些变量不会被破坏;如果线程切换其任务中间 Action 并且两个任务分别持有
mutex
或
recursive_mutex
,则伪造死锁或数据访问冲突等。这些是该功能的实现者所关心的严重问题,但是如果我理解正确,那么
async
的当前规范要求通过在调用者的线程上执行任务或就像为该任务创建了新线程一样,对用户隐藏所有这些详细信息。
async
进行的thread
一起使用,该限制的原因是什么?
#include <future>
#include <iostream>
#include <mutex>
#include <vector>
static int tally {};
static std::mutex tally_mutex {};
static void
do_work(const int amount)
{
for (int i = 0; i < amount; ++i)
{
// Might do something actually useful...
const std::unique_lock<std::mutex> lock {tally_mutex};
tally += 1;
}
}
int
main()
{
constexpr int concurrency {10};
constexpr int amount {1000000};
std::vector<std::future<void>> futures {};
for (int t = 0; t < concurrency; ++t)
futures.push_back(std::async(do_work, amount / concurrency));
for (auto& future : futures)
future.get();
std::cout << tally << std::endl;
}
最佳答案
std::async的“问题”是默认情况下您不知道它是否启动线程。如果您的函数需要在单独的线程上运行,那么这是一个问题,因为您的函数可能要等到调用get()或wait()后才能运行。
您可以传递std::launch::async来确保函数在其自己的线程上启动,就像无法分离BG e的std::thread一样。
关于multithreading - Stroustrup指的是std::async的什么限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26372904/
练习 13,来自 Stroustrup 的编程原则和使用 c++ 的实践的第 12 章。 A superellipse is a two-dimensional shape defined by th
在《编程:使用 C++ 的原理与实践》的第 5.10.1 章中,有一个“试试这个”练习,用于调试某个区域的错误输入。前置条件是长度和宽度的输入是否为 0 或负数,而后置条件是检查面积是否为 0 或负数
这些是 Stroustrup 在他最新的 C++ 书中给出的指导方针在函数中传递参数: [1] Use pass-by-value for small objects. [2] Use pass-by
在 Stroustrup 的 C++ 编程语言书(第 3 版)中,在数值章节中,他展示了以下代码片段: void f(valarray& d) { slice_array& v_even =
Stroustrup C++ 第 4 版第 197 页有以下示例,这些示例导致打印的字符流递增,直到 null 而不是 "abc"。问题:如何评估 ++*p? ++ 和 * 是相同的优先级和从右到左的
以下示例来自 Stroustrup C++ 4th Ed。第 519 页。这是我从 K&R C 和更早的 Stroustrup 书中的理解,即原始类型的局部自动变量 未定义或未知被初始化 .原始类型的
我正在使用 Stroustrup C++ 第 4 版第 1182 页的这个随机数示例。编译器在 auto 行报告错误。 ,说明 auto 不能与类的非静态成员一起使用。我对这种绑定(bind)的结果类
“没有匹配的成员函数push_back” 在 Bjarne 的原始版本中,C 的 vector 是这样写的 vector*> res; 但是这个 Value_type 模板不能正常工作所以我只是用 C
请引用B.Stroustrup的《TCPL》第4版41.2.2 Instruction Reordering部分,我抄录如下: To gain performance, compilers, opti
我在 YouTube 上看到了这个视频:https://www.youtube.com/watch?v=YQs6IC-vgmo其中 Bjarne 说最好使用 vector ,而不是链表。我无法掌握全部
在 C++ 之旅的第 83 页,Stroustrup 提供了以下正则表达式: R"((\ew+))" 书中没有任何地方定义\e,我在互联网上也找不到任何相关信息。\e 在正则表达式中代表什么? 最佳答
目前我正在阅读 Stroustrup Programming: Principles and Practice C++。我遇到了这个例子: typedef void (*Pfct0)(struct S
以下幻灯片来自 Bjarne Stroustrups 的演讲“C++ 的本质”: 我是否通过以下简单示例(值、原始指针、资源成员/子对象的智能指针)理解了他的技术?: 1. class foo{
我正在阅读 Bjarne Stroustrup “The C++ programming language” 一书,其中提到在变量定义中使用 auto 的原因之一是: The definition i
我决定自己学习 C++,我已经有了一些 Java 经验。 在 Bjarne Stroustrup 的书中他说: Prompt the user to enter the age of the reci
我正在查看 Straustrup 的 hash_map 实现。这将给出他如何实现的直觉 template, class EQ = equal_to, class A = allocator > cla
我正在使用 Stroustrup 的天鹅书。我在从 a 获取输出时遇到了问题 vector 。我遵循了 sec 的文本示例。 4.6.3 第 121 页。设法编译了源代码并能够执行它。后输入由空格分隔
在 Stroustrup 的书 Programming with C++ page 102 中,他使用 cin 读入 double 后跟 char,用于将厘米转换为英寸. 他使用的代码: cin >>
我正在阅读 Bjarne S 的 C++ 编程语言。 在第 77 页,第 4.8 节中,我发现了这一点: "枚举器可以用常量表达式初始化(§C.5) 的整数类型 (§4.1.1)。这枚举的范围包含向上
Stroustrup 提供了一个 Can_copy template .它是如何工作的? template struct Can_copy { static void constraints(
我是一名优秀的程序员,十分优秀!