我在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)
答案 0 :(得分:2)
显然,您的三个元素函数应该由不同的线程调用。因此,您需要在每个线程中锁定互斥对象,以保护公用变量flag
免受并发访问。因此,您应该取消注释mtx.lock()
中的mtx.unlock()
和first
,以保护它。函数second
和third
应用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
时不完整。您需要互斥体来防止这种情况,并停止printSecond
和printThird
。避免同时运行。
答案 2 :(得分:1)
flag
将second()
分配给third()
时,可以同时评估first()
或1
中的flag
检查条件。 / p>
重写此
cond.wait(lk, [this](){return flag==1;});
像这样,可能更容易看到:
while(!(flag==1)) cond.wait(lk);
它与您的wait()
带有lambda的功能相同。
flag
应该在互斥量保持时被读取-但是first
并不关心互斥量,并会在需要时将其分配给flag
。对于非原子类型,这是一场灾难。它可能起作用 10000000次(可能会)-但实际上事情同时发生时(因为您允许)-景气-未定义的行为