- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个函数,语句 foo
应该在 lock_guard
下执行,但只有当一个指向 mutex
对象的指针被提供给函数作为参数。否则 foo
不必由 lock_guard
保护。
我不能在 if
中使用 lock_guard
,因为当 if
阻塞时锁会立即释放结束。
所以,这段代码是胡说八道:
bar( std::mutex * optionalMutex = nullptr )
{
...
if ( nullptr != optionalMutex ) {
std::lock_guard<std::mutex> lockScope( *optionalMutex );
} <- Here the lock ends
foo... <- foo is not protected when optionalMutex was provided
}
我尝试过这样的事情:
bar( std::mutex * optionalMutex = nullptr )
{
...
nullptr == optionalMutex ? 0 : std::lock_guard<std::mutex> lockScope( *optionalMutex );
// this scope should be protected by lock_guard when optionalMutex was provided
foo...
}
或多或少,对我来说唯一可能的解决方案是重复 foo
:
bar( std::mutex * optionalMutex = nullptr )
{
...
if ( nullptr != optionalMutex ) {
std::lock_guard<std::mutex> lockScope( *optionalMutex );
foo...
} else {
foo...
}
}
编译器 gcc 4.9.3
未编译第二个示例并报错:error: expected primary-expression before 'lockScope'
。 更新: Superlokkus 在他的回答中解释了原因。
但我确实想避免任何代码重复,因此也要避免重复 foo
。
我的问题:
有没有一种优雅的方式来解决这个问题,不使用重复的foo
。我知道,我可以使用 lambda 函数来 group foo
但我很好奇是否有其他解决方案。
最佳答案
这个怎么样?
void bar(std::mutex * optionalMutex = nullptr)
{
auto lockScope = (optionalMutex == nullptr) ?
std::unique_lock<std::mutex>()
: std::unique_lock<std::mutex>(*optionalMutex);
}
解释:您的编译器对您之前的语句有问题,因为您不能突然更改三元 ?
的类型表达;即文字 0
不是 std::lock_guard
反之亦然。于是我把两个分支改成了同类型,这里是std::unique_lock<std::mutex>
因为lock_guard
没有设计为在没有有效互斥锁的情况下使用。但还是更喜欢std::lock_guard
超过 std::unique_lock
在更简单的情况下,因为它会使您的代码更具可读性。
您的语句对于编译器也不可行,即即使语法正确,因为变量 lockScope 只会存在于一个分支中。
关于c++ - 有条件地使用 std::lock_guard,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38610307/
我有一个函数 foo在多个线程中运行(std::thread t([&]() { foo(a); }): void foo(int a) { if (x && y != a) {
我有包含在 shared_ptr 中的资源“resource”,我想从其他线程访问它。当我这样做时: // foo.h class Foo{ public: std::shared_ptr G
这个问题在这里已经有了答案: Is a copy-on-return operation executed prior or after lock_guard destructor? [duplica
我写了 3 个互斥类 TMutex、TCondition 和 TSpinLock 都有一个 void lock() 和一个 void unlock() 成员。现在我想对它们使用 std::lock_g
一个线程有如下的控制流程: mutex.lock() if (condition) { // do synced things mutex.unlock(); // do pa
我有一个数组,其中每个条目都是一个链表。为了避免在访问链接列表时出现同步问题,我为每个条目添加了一个互斥量。 我的问题是,我能否将循环的每次迭代中对 lock 和 unlock 的以下调用转换为一个
我刚刚了解到 std::lock_guard 我想知道为什么它是一个模板。 到现在我只看到std::lock_guard与 std::mutex在尖括号内。 最佳答案 使用 std::lock_gua
我刚刚了解到 std::lock_guard 我想知道为什么它是一个模板。 到现在我只看到std::lock_guard与 std::mutex在尖括号内。 最佳答案 使用 std::lock_gua
如果我在 lock_guard 下有一些代码,例如: std::thread t([&]() { std::lock_guard lock(m); // some simple ope
我正在使用一些多线程代码(使用并发数据结构),其中一部分需要我锁定一组互斥锁。对于我的实现,我使用了一个 lock_guards vector ,因为我不一定知道我需要锁定多少个互斥锁,而且我可能会遇
我认为这是关于左值实例化排序的更普遍的问题。 简而言之,这安全吗?: void func1() { std::lock_guard lock( mutex ); //do some s
https://en.cppreference.com/w/cpp/thread/lock_guard (constructor) constructs a lock_guard, optionall
[无需点击链接即可理解问题]。 我在this answer中结合了单例模式的实现, 连同 this other answer 的同步文件写入. 然后我想看看SynchronizedFile的接口(in
我试图在以下代码中锁定我的互斥量列表,以便一次只有一个线程可以搜索、解锁、锁定或修改它。 #include #include #include #include #include #incl
编辑: 看起来,问题是我实际上并没有创建一个 lock_guard 的本地实例,而只是一个匿名的临时实例,它立即再次被销毁,如下面的评论所指出的。 Edit2:启用 clang 的线程清理器有助于在运
我有简单的代码:第一个线程将 std::strings 推送到 std::list,第二个线程弹出 std::strings 从这个 std::list。所有 std::list 的操作都受到 std
我目前正在研究 Google 的 Filament 作业系统。你可以找到源代码 here .让我感到困惑的部分是这个 requestExit() 方法: void JobSystem::request
这个问题在这里已经有了答案: C++ return value created before or after auto var destruction? (2 个答案) in C++ which
在下面的代码中,bad 方法编译失败,但是 good 方法没有。为什么提供对 this 的显式引用在这里有所不同? #include class Foo { private: std::mut
我有一个函数,语句 foo 应该在 lock_guard 下执行,但只有当一个指向 mutex 对象的指针被提供给函数作为参数。否则 foo 不必由 lock_guard 保护。 我不能在 if 中使
我是一名优秀的程序员,十分优秀!