Antrean serentak multi-produsen dan multi-konsumen berbatas yang ditulis dalam C++11.
Ini adalah pertempuran yang diperkeras dan digunakan setiap hari dalam produksi:
Ini telah dikutip oleh makalah berikut:
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);
Membangun MPMCQueue
baru yang menampung item tipe T
dengan capacity
capacity .
void emplace(Args &&... args);
Enqueue item menggunakan konstruksi inplace. Blokir jika antrian penuh.
bool try_emplace(Args &&... args);
Cobalah untuk memasukkan item ke dalam antrean menggunakan konstruksi inplace. Mengembalikan true
jika berhasil dan false
jika antrian penuh.
void push(const T &v);
Enqueue item menggunakan konstruksi salinan. Blokir jika antrian penuh.
template <typename P> void push(P &&v);
Enqueuekan item menggunakan konstruksi perpindahan. Berpartisipasi dalam resolusi kelebihan beban hanya jika std::is_nothrow_constructible<T, P&&>::value == true
. Blokir jika antrian penuh.
bool try_push(const T &v);
Cobalah untuk memasukkan item ke dalam antrean menggunakan konstruksi salinan. Mengembalikan true
jika berhasil dan false
jika antrian penuh.
template <typename P> bool try_push(P &&v);
Cobalah untuk memasukkan item ke dalam antrean menggunakan konstruksi gerakan. Berpartisipasi dalam resolusi kelebihan beban hanya jika std::is_nothrow_constructible<T, P&&>::value == true
. Mengembalikan true
jika berhasil dan false
jika antrian penuh.
void pop(T &v);
Hapus antrean item dengan menyalin atau memindahkan item ke v
. Blokir jika antrian kosong.
bool try_pop(T &v);
Cobalah untuk menghapus antrean item dengan menyalin atau memindahkan item ke v
. Kembalikan true
jika berhasil dan false
jika antrian kosong.
ssize_t size();
Mengembalikan jumlah elemen dalam antrian.
Ukurannya bisa negatif bila antrian kosong dan setidaknya ada satu pembaca yang menunggu. Karena ini adalah antrean serentak, ukurannya hanyalah perkiraan upaya terbaik sampai semua thread pembaca dan penulis telah bergabung.
bool empty();
Mengembalikan nilai benar jika antrian kosong.
Karena ini adalah antrian bersamaan, ini hanyalah tebakan upaya terbaik sampai semua thread pembaca dan penulis telah bergabung.
Semua operasi kecuali konstruksi dan penghancuran aman untuk thread.
Masuk:
Dequeue:
Referensi:
Menguji algoritma konkurensi itu sulit. Saya menggunakan dua pendekatan untuk menguji implementasinya:
boost::lockfree::queue
dan lainnya static_assert
jika tersedia std::hardware_destructive_interference_size
jika tersedia [[nodiscard]]
Proyek ini dibuat oleh Erik Rigtorp <[email protected]>.