c++ 如何同步访问字段

y0u0uwnf  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(102)

我正在看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,多个线程并行修改它。这种情况可能发生:

  • 线程AB都从res读取true
  • 线程A写入false
  • 线程B没有看到A的写操作,将其覆盖回true

上述情况可能吗?若否,原因为何?

nhjlsmyf

nhjlsmyf1#

根据文档,seastar::coroutine::parallel_for_each方法在单个分片(即单个线程)中处理所有元素。所以不需要同步。
并行性来自于使用协程执行-多个file_exists调用被并行启动并等待它们的返回值,但返回值由单个线程处理。
这个名字有点混乱,在其他地方“并行”意味着“多线程”,例如。在这里或here

相关问题