次のように、hashTable へのアクセスをミューテックスで保護する必要があります (pthreads と c++ を想定すると、それに応じて変更する必要がありますが、理解できると思います)
int getHashTableSize()
{
pthread_mutex_lock(&yourMutex);
int size = yourHashTable.size();
pthread_mutex_unlock(&yourMutex);
return size;
}
void addThread(TokenType &token)
{
pthread_mutex_lock(&yourMutex);
yourHashTable.addToken(token);
pthread_mutex_unlock(&yourMutex);
}
void removeThread(TokenType &token)
{
pthread_mutex_lock(&yourMutex);
yourHashTable.removeToken(token);
// check if yourHashTable is empty here, and stop service accordingly
pthread_mutex_unlock(&yourMutex);
}
onStartCommand()
{
pthread_mutex_lock(&yourMutex);
// Logic for wake lock, thread creation, and adding to the hash table here
// possibly need to consider recursive mutex locking
pthread_mutex_unlock(&yourMutex);
}
もちろん、それに応じて型を変更し、これらのメソッドを適切なクラスに追加する必要があります。
もう 1 つの一般的な方法は、次のように join を呼び出してスレッドが完了するのを待つことです。もちろん、これはスレッドの数が「静的」である場合にのみ役立ちます。スレッドの作成が動的なアプリケーションを使用している場合、この 2 番目の方法はあまり役に立ちません。
for(int i = 0; i < numThreads; i++)
{
// threadIds is a vector
pthread_join(threadIds[i], NULL);
}
// At this point, all of your threads are complete