请考虑以下代码。我想使用mutex_by_name()
来创建和检索互斥锁。锁不是一个真正的锁,但应该在一秒钟的间隙内完成它。
预期输出是m4.lock()
失败,又称打印lock FAILED
,因为_locked
已设置为true。但它确实锁定了。我是C ++的新手,很确定我错过了一些明显的东西。您能否解释一下如何正确实施。
#include <iostream>
#include <string>
#include <unordered_map>
#include <unistd.h>
class Mutex {
private:
int _id;
bool _locked = false;
void status(std::string s) {
std::cout << _id << " " << name << " " << s << " " << std::endl;
}
public:
const std::string name;
Mutex(std::string name): name(name) {
static int id = 0;
_id = id++;
status("created");
}
Mutex(const Mutex& m): _id(m._id), _locked(m._locked), name(m.name) {
status("copy-constructed");
}
Mutex(Mutex&& m) = delete;
void operator=(Mutex&) = delete;
~Mutex() {
status("deleted");
}
void lock() {
// YES, THIS IS NOT A REAL AND SAFE LOCK
if (!_locked) {
_locked = true;
status("locked");
} else {
status("lock FAILED");
}
}
};
std::unordered_map<std::string, Mutex> mutexe;
Mutex& mutex_by_name(std::string name) {
mutexe.emplace(name, Mutex(name));
auto found = mutexe.find(name);
return found->second;
}
using namespace std;
int main() {
cout << "# 1" << endl;
Mutex m1 = mutex_by_name("hello");
m1.lock();
sleep(1);
cout << "# 2" << endl;
Mutex m4 = mutex_by_name("hello");
m4.lock();
sleep(1);
}
答案 0 :(得分:2)
你必须遇到问题。首先,你不声明m1
和m4
作为参考,它们应该如此。
其次,代码风格:)。
所以,这将解决它:
Mutex &m1 = mutex_by_name("hello");
//...
Mutex &m4 = mutex_by_name("hello");
答案 1 :(得分:1)
主要需要制作m1和m4参考(Mutex&amp; m1)。现在它们是副本,因此不会更新无序映射中的值。