たとえば、複数のスレッドによって同時に計算される作業があります。
デモンストレーションの目的で、作業は while ループ内で実行されます。1 回の反復で、各スレッドは作業の独自の部分を実行し、次の反復が開始される前にカウンターを 1 回インクリメントする必要があります。
私の問題は、カウンターが各スレッドによって更新されることです。
これは比較的単純なことのように思えるので、「ベストプラクティス」または一般的な方法があると思いますか?
問題を説明し、議論を助けるためのサンプルコードを次に示します。(ブーストスレッドを使用しています)
class someTask {
public:
int mCounter; //initialized to 0
int mTotal; //initialized to i.e. 100000
boost::mutex cntmutex;
int getCount()
{
boost::mutex::scoped_lock lock( cntmutex );
return mCount;
}
void process( int thread_id, int numThreads )
{
while ( getCount() < mTotal )
{
// The main task is performed here and is divided
// into sub-tasks based on the thread_id and numThreads
// Wait for all thread to get to this point
cntmutex.lock();
mCounter++; // < ---- how to ensure this is only updated once?
cntmutex.unlock();
}
}
};