私はいくつかの文字列を保持するために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で読み取り/書き込みロックを使用しての正しい方法は何でコンパイルエラーがありますか?
'condition_variable_any'が動作するはずですが、' upgrade_to_unique_lock'なしで書き込みロックを作成するにはどうすればいいですか? – aj3423