我有两个主题。 Thread1以一定的间隔递增其自身的一个变量(耗材)。与此同时,我有thread2,它也增加了thread1的一个变量(iter-> second-> producenum)。当我在两个线程中递增它们时,我是否需要围绕这些变量进行互斥保护?
线程1:
mutex1->lock();
std::map<uint32_t, myframe>::iterator it2 = mymap.find(consumenum);
mylocalframe = it2->second;
mymap.erase (it2);
mutex1->unlock();
consumenum++;
mutex2->lock();
pktctr--;
mutex2->unlock();
线程2:
std::map<int, Thread1 *>::iterator iter = mythreads.find(id);
iter->second->mutex1->lock();
iter->second->mymap.insert( std::pair<uint32_t,myframe>(iter->second->producenum, myframeval));
iter->second->mutex1->unlock();
iter->second->producenum++;
iter->second->mutex2->lock();
iter->second->pktctr++;
iter->second->mutex2->unlock();
答案 0 :(得分:2)
是的,当然你需要它,例如关键部分:
std::mutex g_i_mutex;
void increment_map(std::map &myMap)
{
std::lock_guard<std::mutex> lock(g_i_mutex);
// increment map
// g_i_mutex is automatically released when lock
// goes out of scope
}
答案 1 :(得分:2)
根据您发布的代码,不,您不需要互斥锁。只有在从两个线程访问相同数据时才需要互斥锁。只要在Thread2的生命周期内没有删除Thread1,就可以从2个不同的线程中增加2个不同的整数。
答案 2 :(得分:1)
是的,你需要它。如果你处理var1或var2,你必须对这些变量使用相同的互斥保护。