1

我有两个线程。Thread1 正在以一定的间隔递增它自己的变量(consumum)之一。同时,我有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();
4

3 回答 3

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
}
于 2013-09-23T14:14:50.393 回答
2

根据您发布的代码,不,您不需要互斥锁。仅当您从两个线程访问相同的数据时才需要互斥锁。从 2 个不同的线程递增 2 个不同的整数是可以的,只要 Thread1 在 Thread2 的生命周期内没有被删除。

于 2013-09-23T14:32:30.720 回答
1

是的,您需要它。如果您处理 var1 或 var2,则必须围绕这些变量使用相同的互斥锁保护。

于 2013-09-23T14:31:32.967 回答