是否需要锁定?

时间:2019-08-27 11:48:26

标签: c++ multithreading locking stdmutex

我在leetcode中遇到了一个问题。我已经在discuss中查看了一些解决方案。但是我的solution与其他人不同,因为我没有在方法 for (Method method : clazz.getMethods()) { if (method.getReturnType().isInterface() && method.getName().startsWith("get")) { // getter method returns an interface so find its implementation class Class beanClass = context.getBean(method.getReturnType()).getClass(); if (clazz.isAssignableFrom(beanClass)) { resolver.addMapping(method.getReturnType(), method.getReturnType()); mapInterfaces(objectMapper, clazz, resolver); } } } 中使用lock。我想知道我的代码是否正确。此外,您能给我一些有关我的代码的建议吗?

我认为没有必要像first那样在方法unique_lock中使用void first(function<void()> printFirst),对吗?

void second(function<void()> printSecond)

3 个答案:

答案 0 :(得分:2)

显然,您的三个元素函数应该由不同的线程调用。因此,您需要在每个线程中锁定互斥对象,以保护公用变量flag免受并发访问。因此,您应该取消注释mtx.lock()中的mtx.unlock()first,以保护它。函数secondthird应用unique_lock作为替代方法。

始终确保在调用cond.notify_all()之前解锁互斥锁,方法是在mtx.unlock()之前调用unique_lock或将second用作内部代码块的局部变量,如private:所示。

更多建议

在类定义底部的元素变量之前放置flag,以防止它们受到外部访问。这样可以确保在不锁定互斥锁的情况下无法更改let channel = client.channels.get("channelid") as Discord.TextChannel; channel.send("what you want to send to that channel");

答案 1 :(得分:1)

这是必需的。

在这种情况下,您的代码产生了正确的输出。 printFirst很有可能在调用printSecond时不完整。您需要互斥体来防止这种情况,并停止printSecondprintThird。避免同时运行。

答案 2 :(得分:1)

flagsecond()分配给third()时,可以同时评估first()1中的flag检查条件。 / p>

重写此

cond.wait(lk, [this](){return flag==1;});

像这样,可能更容易看到:

while(!(flag==1)) cond.wait(lk);

它与您的wait()带有lambda的功能相同。

flag应该在互斥量保持时被读取-但是first并不关心互斥量,并会在需要时将其分配给flag。对于非原子类型,这是一场灾难。它可能起作用 10000000次(可能会)-但实际上事情同时发生时(因为您允许)-景气-未定义的行为