1

次のメソッドでプライベートメンバーとして MessageQueue クラスのブーストミューテックスを使用しています

 void MessageQueue::Dequeuee()
    {
Request rq(messageWareHouse.front().reqID,messageWareHouse.front().seq,
                                                        messageWareHouse.front().sMessage);
        while(true)
        {
            boost::unique_lock<boost::mutex> lock(qMutex);
            qCond.wait(lock);

    **reqCollection**.find(messageWareHouse.front().reqID)->second.addSegments(messageWareHouse.front().seq,
                messageWareHouse.front().sMessage );
                    }
    ....

reqCollection はマップです

map<size_t, Request> reqCollection;

内部リクエストでミューテックスを初期化しようとすると、以下のエラーが発生します

class Request
{

private:

    size_t RequestID;

public:
    boost::mutex qMutex;
    Request(size_t requestID,size_t seq, std::string sMessage);
    void addSegments(size_t seq, std::string sMessage);

};

ここでグーグルでこのエラーを検索した限り、問題の解決策は次のように述べられています

ミューテックスまたはミューテックスを含むクラスの (スマート) ポインターを配置する

しかし、これは、プロジェクト全体でポインターを渡すことによって 1 つのミューテックス変数しか使用できないということですか? ブーストがミューテックスを保護している理由

エラーは

エラー 7 エラー C2248: 'boost::mutex::mutex': クラス 'boost::mutex' で宣言されたプライベート メンバーにアクセスできません

4

2 に答える 2

3

ミューテックスはコピーできません。これはシステム リソースであるため、コピーされるクラスにある場合、コンパイラによって生成されたコピー コンストラクターが呼び出され、コンパイラによって生成されたコピー コンストラクターはミューテックスをコピーしようとしますが、コピー コンストラクターはプライベート。したがって、エラー。

リソースのコピーが必要ない場合は、別のミューテックスが必要な可能性があるため、独自のコピー コンストラクターを記述する必要があります。コピーしたオブジェクトでミューテックスを共有したくない場合は、shared_ptr を使用できます。

または、オブジェクトをまったくコピーしたくないstd::map< size_t, std::unique_ptr< Request > >場合は、std::unique_ptr がない場合に使用できます。

于 2012-08-10T06:15:49.830 に答える
1

このコンパイル エラーが発生している行を投稿していただければ幸いです。しかし、(コンストラクターが) private である boost::mutex クラスのコピー コンストラクターを呼び出そうとしているのではないかと強く疑っています。

于 2012-08-10T06:16:01.717 に答える