-1

我需要使用 for 循环中使用的 std::mutex 来保护数据容器,如下所示:

for (auto it = data.begin(); it != data.end(); ++it)
{
    std::cout << it->param;
    ...
}

我可以想到几个选项,但它们像这样丑陋:

{ // artificial scope
    std::scoped_lock lock(myMutex)
    for (auto it = data.begin(); it != data.end(); ++it)
    {
        std::cout << it->param;
        ...
    }
}

有没有一种好看的方法来实现这一点?我正在考虑类似以下(C++ 17)的内容,但这无法编译。:(

for (std::scoped_lock lock(myMutex), auto it = data.begin(); it != data.end(); ++it)

或者,

for (auto [lock, it] = std::pair(std::scoped_lock lock(myMutex), data.begin()); it != data.end(); ++it)
4

2 回答 2

3

引入了带有初始化器的基于范围的 for 循环:

for (std::scoped_lock lock(myMutex); auto &&x : data)
{
    std::cout << x.param;
}

GCC 9 和 Clang 8 已经支持此功能,但需要-std=c++2a标志。

于 2019-11-28T12:39:43.997 回答
0

正如评论中所建议的,我不会忽视将“丑陋”块提取到单独方法中的明显解决方案。但你也可以这样做

std::unique_lock<std::mutex> guard(mutex);
for (auto it = data.begin(); it != data.end(); ++it) {
    // ...
}
guard.unlock();

如果您不打算自己释放锁,则优先std::lock_guard选择;也意味着锁定几个互斥锁。std::unique_lockscoped_lock

于 2019-11-28T12:57:10.880 回答