1

我有一个服务,每次调用 onStartCommand 时都会触发一个新的网络线程。当最后一个线程完成时,我必须停止服务。

有什么好的做法来处理这个问题吗?现在我在服务中有一个 HashTable,我在线程启动/结束时添加和删除一个令牌。

每次线程完成时,它都会从哈希表中删除令牌,如果哈希表为空,则我停止服务。这可行,但我知道它不是 100% 安全的,因为旧线程可以在新线程将其令牌插入哈希表之前检查哈希表的大小,因此,当实际上有一个新线程开始时停止服务.

4

1 回答 1

1

您需要互斥锁保护对哈希表的访问,如下所示:(假设 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);
}

当然,您必须相应地更改类型并将这些方法添加到适当的类中。

另一种常见的做法是通过调用 join 来等待线程完成,如下所示。这当然只有在线程数是“静态的”时才有用。如果您有一个线程创建是动态的应用程序,那么第二种方法可能没有那么有用。

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 回答