add original source
This commit is contained in:
49
source/listing_6.9.cpp
Normal file
49
source/listing_6.9.cpp
Normal file
@@ -0,0 +1,49 @@
|
||||
template<typename T>
|
||||
class threadsafe_queue
|
||||
{
|
||||
private:
|
||||
node* get_tail()
|
||||
{
|
||||
std::lock_guard<std::mutex> tail_lock(tail_mutex);
|
||||
return tail;
|
||||
}
|
||||
|
||||
std::unique_ptr<node> pop_head()
|
||||
{
|
||||
std::unique_ptr<node> const old_head=std::move(head);
|
||||
head=std::move(old_head->next);
|
||||
return old_head;
|
||||
}
|
||||
|
||||
std::unique_lock<std::mutex> wait_for_data()
|
||||
{
|
||||
std::unique_lock<std::mutex> head_lock(head_mutex);
|
||||
data_cond.wait(head_lock,[&]{return head!=get_tail();});
|
||||
return std::move(head_lock);
|
||||
}
|
||||
|
||||
std::unique_ptr<node> wait_pop_head()
|
||||
{
|
||||
std::unique_lock<std::mutex> head_lock(wait_for_data());
|
||||
return pop_head();
|
||||
}
|
||||
|
||||
std::unique_ptr<node> wait_pop_head(T& value)
|
||||
{
|
||||
std::unique_lock<std::mutex> head_lock(wait_for_data());
|
||||
value=std::move(*head->data);
|
||||
return pop_head();
|
||||
}
|
||||
|
||||
public:
|
||||
std::shared_ptr<T> wait_and_pop()
|
||||
{
|
||||
std::unique_ptr<node> const old_head=wait_pop_head();
|
||||
return old_head->data;
|
||||
}
|
||||
|
||||
void wait_and_pop(T& value)
|
||||
{
|
||||
std::unique_ptr<node> const old_head=wait_pop_head(value);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user