0

A と B では、どちらが優れているか、または速いですか?

std::deque<Myclass> queue;
... // do something
std::size_t size = 0;
... // create n threads, one push queue and others pop queue.

// a thread do below
#ifdef A
pthread_rwlock_wrlock(&rwlock);
queue.push_front(myobj);
size = queue.size();
pthread_rwlock_unlock(&rwlock);
#endif

#ifdef B
pthread_rwlock_wrlock(&rwlock);
queue.push_front(myobj); 
pthread_rwlock_unlock(&rwlock);
// if there is some operation,
// I think this B is better,
// because I should get the newest size.
pthread_rwlock_rdlock(&rwlock);
size = queue.size();
pthread_rwlock_unlock(&rwlock);
#endif

// other threads do below
pthread_rwlock_wrlock(&rwlock);
queue.pop_back(); 
pthread_rwlock_unlock(&rwlock);

それは私の理解していません。

情報や提案は私にとって大きな助けになります!

下手な英語でごめんなさい!

4

1 に答える 1

0

Aバージョンは、ロックを 1 回だけ取得する必要があるため高速です (いずれにせよ、書き込みロックを 1 回取得する必要があります) また、他のスレッドが同時にキューにアクセスできないため、返されるサイズは最新( pushの時点) になります。

Bを実行すると、サイズについて別の答えが得られる可能性がありますが(ご指摘のとおり)、ロックを解放すると (どちらのシナリオでも)、size変数は常に古い値を保持できます (スレッドがキューを更新するまでにスレッドが更新されている可能性があります)。の値を使用したいsize)

また、リーダーは、キューが空の場合に例外を回避するために、(保護されたセクション内の) サイズについてキューを照会する必要があります。

于 2012-06-21T15:57:10.960 に答える