2016-05-23 13 views
0

私はいくつかの文字列を保持するためにstd :: listを使用します.1つのスレッドはリストに書き出し、他のスレッドはそこから読み込みます(リストを最初に取得してリストから消去します)。ここでは、コードです:upgrade_to_unique_lock + condition_variableをどのようにして動作させるか?

std::list<string> list_; 

boost::condition_variable cond; 
boost::shared_mutex mtx; 

int get_size() { 
    boost::shared_lock<boost::shared_mutex> lock(mtx); 
    return list_.size(); 
} 

// add a string to the list 
// invoked by only one thread 
void add_one(const string& p) { 
    { 
     boost::upgrade_lock<boost::shared_mutex> lock(mtx); 
     boost::upgrade_to_unique_lock<boost::shared_mutex> uniquelock(lock); 

     list_.push_back(p); 
    } 
    cond.notify_one(); 
} 

// get the first string and remove it from the list 
// invoked by many threads 
string pick_one() { 
    string ret; 
    { 
     boost::upgrade_lock<boost::shared_mutex> lock(mtx); 
     boost::upgrade_to_unique_lock<boost::shared_mutex> uniquelock(lock); 

     if(!list_.size()) { // if empty, wait for notify 
      cond.wait(uniquelock, [&]{ return list_.size() > 0; }); // compile error 
     } 
     ret = list_.front(); 
     list_.pop_front(); 
    } 
    return ret; 
} 

ラインcond.wait(uniquelock, ...

condition_variableで読み取り/書き込みロックを使用しての正しい方法は何でコンパイルエラーがありますか?

答えて

0

これを行うことはできません。upgrade_to_unique_lockは、生涯にわたってロックの排他アクセスを取得するRAIIヘルパーです。 docs hereを参照してください。

boost :: upgrade_to_unique_lockでは、boost :: upgrade_lockを排他的所有権に一時的にアップグレードできます。 boost :: upgrade_lockのインスタンスへの参照で構築された場合、そのインスタンスがロック可能なオブジェクトのアップグレード所有権を持っている場合、その所有権は排他的所有権にアップグレードされます。 boost :: upgrade_to_unique_lockインスタンスが破棄されると、Lockableの所有権がアップグレードの所有権に戻されます。

はあなたが説明hereとしてboost::condition_variable_anyを使用する必要がありますブースト条件変数でshared_mutexを使用したい場合。 2つの条件変数の差(stdではなく、Boostではなく)は、hereに含まれています。

+0

'condition_variable_any'が動作するはずですが、' upgrade_to_unique_lock'なしで書き込みロックを作成するにはどうすればいいですか? – aj3423

関連する問題