比較的完全なバージョンのスレッドセーフなキュー

クラスthreadsafe_queue
{
パブリック:
threadsafe_queue():ヘッド(新しいノード)、テイル(head.get()){}
threadsafe_queue(CONST threadsafe_queue&その他)=削除します。
threadsafe_queue&演算子=(CONST threadsafe_queue&その他)=削除します。
std :: shared_ptrの<T> try_pop()
{
のstd :: unique_ptrを<ノード> CONST old_head = try_pop_head()。
返すold_head old_head->データ:?のstd :: shared_ptrの<T>();
}
BOOL try_pop(T&値)
{
old_head = try_pop_head(値)はstd :: unique_ptrを<ノード> CONST。
old_head返します。
}
のstd :: shared_ptrの<T> wait_and_pop()
{
のstd :: unique_ptrを<ノード> CONST old_head = wait_pop_head()。
>データold_head-返します。

ボイドwait_and_pop(T&値)
{
のstd :: unique_ptrを<ノード> CONST old_head = wait_pop_head(値)。
}
ボイド空()
{
のstd :: lock_guard <はstd ::ミューテックス> head_lock(head_mutex)。
リターン(ヘッド== get_tail());
}
ボイドプッシュ(TのNEW_VALUE)
{
のstd :: shared_ptrの<T> NEW_DATA(STD :: make_shared <T>(STD ::移動(NEW_VALUE)))。
std :: unique_ptrを<ノード> P(新しいノード)。
{
STD :: lock_guard <はstd ::ミューテックス> tail_lock(tail_mutex)。
tail->データ= NEW_DATA。
ノード* CONST new_tail = p.get()。
tail->次= STD ::移動(P)。
尾= new_tail。
}
data_cond.notify_one()。
}

プライベート:
ノード* get_tail()
{
のstd :: lock_guard <はstd ::ミューテックス> tail_lock(tail_mutex)。
尾を返します。
}
のstd :: unique_ptrを<ノード> pop_head()
{
のstd :: unique_ptrを<ノード> CONST old_head = STD ::移動(ヘッド)
ヘッド= STD ::移動(old_head->次);
old_head返します。
}
のstd :: unique_lockの<はstd ::ミューテックス> wait_for_data()
{
のstd :: unique_lockの<はstd ::ミューテックス> head_lock(head_mutex)。
data_cond.wait(head_lock、[b] {戻りヘッド= get_tail();!})。
std ::移動(head_lock)を返します。
}
のstd :: unique_ptrを<ノード> wait_pop_head()
{
のstd :: unique_lockの<はstd ::ミューテックス> head_lock(wait_for_data())。
リターンpop_head();
}
std :: unique_ptrを<ノード> wait_pop_head(T&値)
{
のstd :: unique_lockの<はstd ::ミューテックス> head_lock(wait_for_data())。
値= STD ::移動(頭部>データ)。
リターンpop_head();
}
のstd :: unique_ptrを<ノード> try_pop_head()
{
のstd :: lock_guard <はstd ::ミューテックス> head_lock(head_mutex)。
IF(head.get()== get_tail())
{
返すのstd :: unique_ptrを<ノード>();
}
)(pop_headを返します。
}
のstd :: unique_ptrを<ノード> try_pop_head(T&値)
{
のstd :: lock_guard <はstd ::ミューテックス> head_lock(head_mutex)。
IF(head.get()== get_tail())
{
返すのstd :: unique_ptrを<ノード>();
}
値= STD ::

リターンpop_head();
}

プライベート:
構造体のノード
{
のstd :: shared_ptrの<T>データ;
std :: unique_ptrを<ノード>次。
}。

std::mutex head_mutex;
std::unique_ptr<node> head;
std::mutex tail_mutex;
node* tail;
std::condition_variable data_cond;

}。

ます。https://www.jianshu.com/p/bb005eb59676で再現

おすすめ

転載: blog.csdn.net/weixin_33725270/article/details/91214610