使用 std::mutex 保护环路
Protecting for loop with std::mutex
我需要使用 std::mutex 保护数据容器,该容器用于 for 循环,如下所示:
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)
> C++20 引入了带有初始值设定项的基于范围的 for 循环:
for (std::scoped_lock lock(myMutex); auto &&x : data)
{
std::cout << x.param;
}
GCC 9 和 Clang 8 已支持此功能,但需要-std=c++2a
标志。
正如评论中所建议的那样,我不会忽视将"丑陋"块提取到单独方法中的明显解决方案。但你也可以做
std::unique_lock<std::mutex> guard(mutex);
for (auto it = data.begin(); it != data.end(); ++it) {
// ...
}
guard.unlock();
如果您不打算自己松开锁,则更喜欢std::lock_guard
而不是std::unique_lock
;scoped_lock
也旨在锁定多个互斥锁。
相关文章:
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 为什么在保护模式下继承升级不起作用
- 访问被拒绝后,c++中的故障保护代码
- C++:无法访问声明的受保护成员
- 普通环路未使用gcc 4.8.5自动矢量化
- 为什么您需要C++头文件的包含保护
- lock_guard是否保护返回值
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 继承和友元函数,从基类访问受保护的成员
- 为什么派生类的好友不能使用受保护的成员?
- C++:为什么无法在派生类中访问受保护的构造函数?
- std::mutex 如何防止线程修改?
- 公共/私有/受保护是否会更改内存中结构的排列?
- 所以我正在为我的学校作业练习继承,但我无法正确实施标题保护
- C2011: 'Card':"类"类型重新定义(尽管使用了包含保护并且没有在文件中重新定义.cpp类)
- 使用 std::mutex 保护环路
- 死锁使用 std::mutex 来保护多个线程中的 cout
- Mutex防护:是否有自动保护物体的机制
- 无法获取 std::mutex 以正确保护线程访问