【发布时间】:2020-03-04 01:22:08
【问题描述】:
我有以下功能:
int helper(int id) {
static std::map<int,int>* lookup_table = new std::map<int,int>();
// Modify lookup_table
return (it == lookup_table->end()) ? -1 : 0;
}
helper 在多个线程中被调用。有什么方法可以防止lookup_table 出现竞争条件?
这样就够了吗?
static std::mutex helper_lock;
int helper(int id) {
static std::map<int,int>* lookup_table = new std::map<int,int>();
helper_lock.lock();
// Modify lookup_table
helper_lock.unlock();
return (it == lookup_table->end()) ? -1 : 0;
}
【问题讨论】:
-
为什么不编写惯用的 C++ 代码?只需使用锁定类。
-
等等...我看到修改是什么让你丧命。每次都修改吗?附带问题:为什么
lookup_table是动态分配的?对于库容器来说,这是一个非常不寻常(而且通常很糟糕)的选择。他们的部分工作是保护您免受手动内存管理的影响。 -
是的,您需要一个互斥锁来控制对静态变量的访问。而且,不,您不需要它是一个指针,并使用
new分配。无论如何,这绝对没有任何用处。static std::map<int,int> lookup_table;也能正常工作,并且可以减少您痛苦的键盘的大量磨损。最后,使用锁守卫,而不是显式锁定/解锁互斥锁。这是避免编写一堆错误的有保证且免费的方法。
标签: c++ multithreading thread-safety