1

私は2つのスレッドを持っています。Thread1 は、特定の間隔で独自の変数 (consumenum) の 1 つをインクリメントしています。同時に、スレッド 1 の変数の 1 つをインクリメントするスレッド 2 があります (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

投稿したコードに基づいて、いいえ、ミューテックスは必要ありません。ミューテックスは、両方のスレッドから同じデータにアクセスする場合にのみ必要です。Thread2 の存続期間中に Thread1 が削除されない限り、2 つの異なるスレッドから 2 つの異なる整数をインクリメントしても問題ありません。

于 2013-09-23T14:32:30.720 に答える
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 に答える
1

はい、必要です。var1 または var2 を処理する場合は、これらの変数に対して同じミューテックス保護を使用する必要があります。

于 2013-09-23T14:31:32.967 に答える