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; };
Menguruskan Benang Pool
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(); } }
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([] { /* ... */ });
Kelebihan Penggabungan Benang
Atas ialah kandungan terperinci Bagaimanakah Penggabungan Benang Berfungsi dalam C 11?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!