我正在看seastar tutorial的这个片段:
#include <seastar/core/coroutines.hh>
#include <seastar/coroutine/parallel_for_each.hh>
seastar::future<bool> all_exist(std::vector<sstring> filenames) {
bool res = true;
co_await seastar::coroutine::parallel_for_each(filenames, [&res] (const seastar::sstring& name) -> seastar::future<> {
res &= co_await seastar::file_exists(name);
});
co_return res;
}
我正在学习高级C++,我怀疑这段代码中有一个种族。&=
操作符实际上是两个操作,读和写,它不是原子的。lambda通过引用捕获res
,多个线程并行修改它。这种情况可能发生:
- 线程
A
和B
都从res
读取true
- 线程
A
写入false
- 线程
B
没有看到A
的写操作,将其覆盖回true
上述情况可能吗?若否,原因为何?
1条答案
按热度按时间nhjlsmyf1#
根据文档,
seastar::coroutine::parallel_for_each
方法在单个分片(即单个线程)中处理所有元素。所以不需要同步。并行性来自于使用协程执行-多个
file_exists
调用被并行启动并等待它们的返回值,但返回值由单个线程处理。这个名字有点混乱,在其他地方“并行”意味着“多线程”,例如。在这里或here。