リストがあるとします。
class CLIENTS
{
public:
CLIENTS();
~CLIENTS();
bool addClient();
bool removeClient();
bool getDataFromClientObj(unsigned int id);
bool storeDataInClientObj(unsigned int id);
private:
// vector, that contains all the clients
boost::ptr_vector<CLIENTOBJ> clients;
// mutex for the client-list
boost::mutex mutex;
};
さらに、getDataFromClientObj() が共有ロック (ミューテックス、プライベート) を取得することを検討してください。それに加えて、getDataFromClient() を介してクライアントからデータを取得できるようにする必要があります。
クライアントのキューにデータがまったくない場合、 getDataFromClient() は、新しいデータを読み取るまで、そのクライアントの条件変数を待機します。
さて、ここに私の問題があります:
getDataFromClient(); getDataFromClient() がミューテックス ロックを保持しているため、新しいクライアントを追加したり、クライアントを削除したりできません。
リストがある場合、シナリオを正確にどのように解決しますか?
ここでもう一度、事実を示します。
- スレッドセーフ リスト (複数のリーダー / 単一のライター)
- いつでもクライアントを追加/削除できること
- 具体的には、各クライアントの (特定の) 条件で待機できること (あるクライアントは新しいデータを自分のキューに格納し、別のクライアントは格納していない可能性があります。その場合、 getDataFromClient() は、新しいデータが読み込まれるまで待機します)
私が思う問題は、クライアントごとに 1 つの条件がある場合 (疑似コード: if(clientsqueue.isEmpty() -> wait)、複数の条件変数が必要であるということです (私は間違っていますか?)
詳細情報:
OS: Windows 7
言語: C++
コンパイラ VS2010