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
Patricia Arquetteasal
2024-12-13 14:27:11591semak imbas

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;
};

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))
    }
}

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();
    }
}

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();
}

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;
}

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();
}

Penggunaan:

thread_pool->QueueJob([] { /* ... */ });

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!

Kenyataan:
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