C ++映射线程同步

时间:2013-09-23 14:12:59

标签: c++ map synchronization

我有两个主题。 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();

3 个答案:

答案 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,你必须对这些变量使用相同的互斥保护。

相关问题