คิวที่เกิดขึ้นพร้อมกันสำหรับผู้บริโภคหลายรายที่มีขอบเขตซึ่งเขียนด้วยภาษา C++11
มันแข็งแกร่งขึ้นในการต่อสู้และใช้ทุกวันในการผลิต:
มันถูกอ้างถึงโดยเอกสารต่อไปนี้:
MPMCQueue< int > q ( 10 );
auto t1 = std::thread([&] {
int v;
q. pop (v);
std::cout << " t1 " << v << " n " ;
});
auto t2 = std::thread([&] {
int v;
q. pop (v);
std::cout << " t2 " << v << " n " ;
});
q.push( 1 );
q.push( 2 );
t1.join();
t2.join();
MPMCQueue<T>(size_t capacity);
สร้าง MPMCQueue
ใหม่ที่เก็บรายการประเภท T
ที่ capacity
จุ
void emplace(Args &&... args);
จัดคิวรายการโดยใช้โครงสร้างแบบแทนที่ บล็อกหากคิวเต็ม
bool try_emplace(Args &&... args);
พยายามจัดคิวรายการโดยใช้โครงสร้างแบบแทนที่ คืนค่า true
เมื่อสำเร็จและ false
หากคิวเต็ม
void push(const T &v);
จัดคิวรายการโดยใช้โครงสร้างการคัดลอก บล็อกหากคิวเต็ม
template <typename P> void push(P &&v);
จัดคิวรายการโดยใช้โครงสร้างการย้าย มีส่วนร่วมในการแก้ไขปัญหาโอเวอร์โหลดเฉพาะในกรณีที่ std::is_nothrow_constructible<T, P&&>::value == true
บล็อกหากคิวเต็ม
bool try_push(const T &v);
พยายามจัดคิวรายการโดยใช้โครงสร้างการคัดลอก คืนค่า true
เมื่อสำเร็จและ false
หากคิวเต็ม
template <typename P> bool try_push(P &&v);
พยายามจัดคิวรายการโดยใช้โครงสร้างการย้าย มีส่วนร่วมในการแก้ไขปัญหาโอเวอร์โหลดเฉพาะในกรณีที่ std::is_nothrow_constructible<T, P&&>::value == true
คืนค่า true
เมื่อสำเร็จและ false
หากคิวเต็ม
void pop(T &v);
แยกคิวรายการโดยการคัดลอกหรือย้ายรายการไปที่ v
บล็อกหากคิวว่างเปล่า
bool try_pop(T &v);
พยายามยกเลิกคิวรายการโดยการคัดลอกหรือย้ายรายการไปที่ v
คืนค่า true
เมื่อสำเร็จและ false
หากคิวว่างเปล่า
ssize_t size();
ส่งกลับจำนวนองค์ประกอบในคิว
ขนาดอาจเป็นค่าลบได้เมื่อคิวว่างเปล่าและมีตัวอ่านอย่างน้อยหนึ่งตัวรออยู่ เนื่องจากนี่คือคิวที่เกิดขึ้นพร้อมกัน ขนาดจึงเป็นเพียงการคาดเดาอย่างดีที่สุด จนกว่าเธรดของผู้อ่านและผู้เขียนทั้งหมดจะเข้าร่วม
bool empty();
คืนค่าเป็นจริงหากคิวว่างเปล่า
เนื่องจากนี่เป็นคิวที่เกิดขึ้นพร้อมกัน จึงเป็นเพียงความพยายามอย่างดีที่สุดในการคาดเดาจนกว่าเธรดของผู้อ่านและผู้เขียนทั้งหมดจะเข้าร่วม
การดำเนินการทั้งหมดยกเว้นการก่อสร้างและการทำลายนั้นปลอดภัย
เข้าคิว:
ยกเลิกคิว:
อ้างอิง:
การทดสอบอัลกอริธึมการทำงานพร้อมกันนั้นยาก ฉันใช้สองวิธีในการทดสอบการใช้งาน:
boost::lockfree::queue
และอื่น ๆ static_assert
หากมี std::hardware_destructive_interference_size
หากมี [[nodiscard]]
โปรเจ็กต์นี้สร้างโดย Erik Rigtorp <[email protected]>