Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Penggabungan Benang Berfungsi dalam C 11?

Bagaimanakah Penggabungan Benang Berfungsi dalam C 11?

Mary-Kate Olsen
Lepaskan: 2024-12-27 13:58:10
asal
214 orang telah melayarinya

How Does Thread Pooling Work in C  11?

Pengumpulan Benang dalam C 11

Pengenalan

Pengumpulan benang ialah teknik untuk menguruskan sesuatu set benang yang boleh diberikan tugasan secara dinamik. Ia menawarkan beberapa kelebihan berbanding mencipta dan memusnahkan benang pada setiap tugas, termasuk prestasi yang dipertingkatkan dan kecekapan sumber.

Memahami Penggabungan Benang

Dalam C 11, kumpulan benang biasanya dilaksanakan menggunakan gabungan benang, mutex dan pembolehubah keadaan. Benang dibuat dan dimulakan di latar belakang, dan tugasan ditambahkan pada baris gilir. Pekerja sentiasa memantau baris gilir, menunggu tugasan baharu tersedia. Sebaik sahaja tugasan tersedia, pekerja akan mengambilnya dan melaksanakannya.

Mencipta Kolam Benang

Untuk mencipta kumpulan benang, kami boleh mentakrifkan kelas ThreadPool:

class ThreadPool {
public:
    void Start();
    void QueueJob(const std::function<void()>& job);
    void Stop();
    bool busy();

private:
    void ThreadLoop();

    bool should_terminate = false;
    std::mutex queue_mutex;
    std::condition_variable mutex_condition;
    std::vector<std::thread> threads;
    std::queue<std::function<void()>> jobs;
};
Salin selepas log masuk

Menguruskan Benang Pool

  • Mula: Memulakan kumpulan benang dengan mencipta dan memulakan benang pekerja.
  • QueueJob: Menambah yang baharu tugas ke barisan untuk pekerja laksanakan.
  • Berhenti: Menghentikan kumpulan benang dengan menetapkan bendera penamatan untuk pekerja dan menunggu mereka selesai.
  • sibuk: Semakan jika kumpulan benang sibuk (iaitu, mempunyai tugas dalam beratur).

Gelung Benang Pekerja

Setiap urutan pekerja menjalankan gelung tak terhingga untuk menunggu dan melaksanakan tugas:

void ThreadPool::ThreadLoop() {
    while (true) {
        std::function<void()> job;
        {
            std::unique_lock<std::mutex> lock(queue_mutex);
            mutex_condition.wait(lock, [this] {
                return !jobs.empty() || should_terminate;
            });
            if (should_terminate) {
                return;
            }
            job = jobs.front();
            jobs.pop();
        }
        job();
    }
}
Salin selepas log masuk

Menggunakan Kolam Benang

Untuk menggunakan kolam benang, hanya buat contoh dan panggil QueueJob untuk menambah tugas:

ThreadPool thread_pool;
thread_pool.Start();
thread_pool.QueueJob([] { /* ... */ });
Salin selepas log masuk

Kelebihan Penggabungan Benang

  • Prestasi yang dipertingkatkan: Dengan menggunakan semula benang, kami menghapuskan overhed mencipta dan memusnahkan utas untuk setiap tugasan.
  • Kecekapan sumber: Bilangan utas dalam kumpulan boleh dilaraskan untuk memadankan beban kerja, menjimatkan sumber.
  • Kod ringkas: Pengumpulan benang menghilangkan pengurusan urutan, menjadikan kod anda lebih ringkas dan lebih mudah diselenggara.

Atas ialah kandungan terperinci Bagaimanakah Penggabungan Benang Berfungsi dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan