1

onStartCommand が呼び出されるたびに新しいネットワーク スレッドを起動するサービスがあります。最後のスレッドが終了したら、サービスを停止する必要があります。

これを処理するための良い習慣はありますか? 現在、サービスに HashTable があり、スレッドの開始/終了時にトークンを追加および削除します。

スレッドが終了するたびに、hashTable からトークンが削除され、hashtable が空の場合はサービスを停止します。これは機能しますが、新しいスレッドがトークンをハッシュテーブルに挿入する直前に古いスレッドがハッシュテーブルのサイズをチェックできるため、100% 安全ではないことがわかっています。そのため、実際に新しいスレッドが開始されたときにサービスが停止します。 .

4

1 に答える 1

1

次のように、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
于 2012-09-06T12:15:31.557 に答える