boost::shared_mutex 这个配合boost::shared_lock类这个相当于读锁
嵌套锁不是一个很好的选择,尽量尝试更改数据结构
条件和期望
线程会等待一个特定事件的发生,或者等待某一条件达成。这可能定期检查任务完成。需要进行同步,可以利用期望和条件达成同步。
例子如下:
class data_chunk
{
{
};
mutex mut;
queue<data_chunk> data_queue;
condition_variable data_cond;
queue<data_chunk> data_queue;
condition_variable data_cond;
bool more_data_to_prepare()
{
return true;
}
{
return true;
}
data_chunk prepare_data()
{
data_chunk a;
return a;
}
{
data_chunk a;
return a;
}
void data_preparation_thread()
{
while (more_data_to_prepare())
{
data_chunk const data = prepare_data();
lock_guard<mutex> lk(mut);
data_queue.push(data);
{
while (more_data_to_prepare())
{
data_chunk const data = prepare_data();
lock_guard<mutex> lk(mut);
data_queue.push(data);
std::cout << "notify" << std::endl;
data_cond.notify_one();
}
}
}
}
void process(data_chunk)
{
{
}
bool is_last_chunk(data_chunk)
{
return false;
}
{
return false;
}
void data_processing_thread()
{
while (true)
{
unique_lock<mutex> lk(mut);
data_cond.wait(lk, [] {return !data_queue.empty(); });
{
while (true)
{
unique_lock<mutex> lk(mut);
data_cond.wait(lk, [] {return !data_queue.empty(); });
std::cout << "wait" << std::endl;
data_chunk data = data_queue.front();
data_queue.pop();
lk.unlock();
process(data);
if (is_last_chunk(data))
{
break;
}
lk.unlock();
process(data);
if (is_last_chunk(data))
{
break;
}
}
}
}