Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Melaksanakan Kolam Benang dengan Cekap dalam C 11 untuk Mengelakkan Penciptaan Benang Berulang dan Overhed Pemadaman?

Bagaimana untuk Melaksanakan Kolam Benang dengan Cekap dalam C 11 untuk Mengelakkan Penciptaan Benang Berulang dan Overhed Pemadaman?

Patricia Arquette
Lepaskan: 2024-12-13 14:27:11
asal
596 orang telah melayarinya

How to Efficiently Implement a Thread Pool in C  11 to Avoid Repeated Thread Creation and Deletion Overhead?

Pengumpulan Benang dalam C 11

Isu: Mencipta dan memadamkan benang berulang kali adalah mahal. Bagaimanakah kita boleh mewujudkan kumpulan benang yang berterusan untuk mengendalikan tugas tanpa menanggung overhed ini?

Penyelesaian:

Melaksanakan Kelas ThreadPool

Untuk mencipta kumpulan benang yang cekap, kami mentakrifkan ThreadPool terlebih dahulu kelas:

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

1. ThreadPool::Start:

Mencipta bilangan urutan tetap berdasarkan keupayaan sistem:

void ThreadPool::Start() {
    const uint32_t num_threads = std::thread::hardware_concurrency();
    for (uint32_t ii = 0; ii < num_threads; ++ii) {
        threads.emplace_back(std::thread(&ThreadPool::ThreadLoop,this))
    }
}
Salin selepas log masuk

2. ThreadPool::ThreadLoop:

Gelung tanpa henti yang menunggu tugasan baharu:

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

3. ThreadPool::QueueJob:

Menambahkan tugas baharu pada kumpulan:

void ThreadPool::QueueJob(const std::function<void()>& job) {
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        jobs.push(job);
    }
    mutex_condition.notify_one();
}
Salin selepas log masuk

4. ThreadPool::busy:

Menyemak sama ada kolam mempunyai kerja aktif:

bool ThreadPool::busy() {
    bool poolbusy;
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        poolbusy = !jobs.empty();
    }
    return poolbusy;
}
Salin selepas log masuk

5. ThreadPool::Stop:

Hentikan kolam dengan anggun:

void ThreadPool::Stop() {
    {
        std::unique_lock<std::mutex> lock(queue_mutex);
        should_terminate = true;
    }
    mutex_condition.notify_all();
    for (std::thread& active_thread : threads) {
        active_thread.join();
    }
    threads.clear();
}
Salin selepas log masuk

Penggunaan:

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

Pelaksanaan ini menyediakan dinamik kumpulan benang di mana urutan berjalan secara berterusan dan menunggu tugasan ditambahkan.

Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan Kolam Benang dengan Cekap dalam C 11 untuk Mengelakkan Penciptaan Benang Berulang dan Overhed Pemadaman?. 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