Penjadualan tugas dan pengurusan kumpulan benang adalah kunci untuk meningkatkan kecekapan dan kebolehskalaan dalam pengaturcaraan serentak C++. Penjadualan tugas: Gunakan std::thread untuk membuat thread baharu. Gunakan kaedah join() untuk menyertai thread. Pengurusan kolam benang: Buat objek ThreadPool dan nyatakan bilangan utas. Tambah tugas menggunakan kaedah add_task(). Panggil kaedah join() atau stop() untuk menutup kumpulan benang.
C++ Pengaturcaraan Serentak: Penjadualan Tugasan dan Pengurusan Kolam Benang
Pengenalan
Dalam pengaturcaraan serentak, penjadualan tugas dan pengurusan kumpulan benang adalah penting untuk meningkatkan kecekapan kecekapan. Artikel ini akan membimbing anda melalui konsep penjadualan tugas dalam C++ dan menunjukkan cara menggunakan std::thread
dan std::mutex
dalam standard C++11 untuk mengurus kolam benang. std::thread
和 std::mutex
来管理线程池。
任务调度
任务调度涉及分配和执行异步任务。在 C++ 中,可以使用 std::thread
来创建新线程:
std::thread t([]() { // 执行异步任务 });
要加入线程,请使用 join()
方法:
t.join();
线程池管理
线程池是一个预先创建并管理的线程集合,可用于处理任务。使用线程池可以避免反复创建和销毁线程的开销。
以下是如何在 C++ 中创建和管理线程池:
class ThreadPool { public: ThreadPool(int num_threads) { for (int i = 0; i < num_threads; i++) { threads_.emplace_back(std::thread([this]() { this->thread_loop(); })); } } void thread_loop() { while (true) { std::function<void()> task; { std::lock_guard<std::mutex> lock(mtx_); if (tasks_.empty()) { continue; } task = tasks_.front(); tasks_.pop(); } task(); } } void add_task(std::function<void()> task) { std::lock_guard<std::mutex> lock(mtx_); tasks_.push(task); } void stop() { std::unique_lock<std::mutex> lock(mtx_); stop_ = true; } ~ThreadPool() { stop(); for (auto& t : threads_) { t.join(); } } private: std::vector<std::thread> threads_; std::queue<std::function<void()>> tasks_; std::mutex mtx_; bool stop_ = false; };
要使用线程池,可以执行以下步骤:
add_task()
方法将任务添加到线程池。join()
或 stop()
方法来关闭线程池并等待所有任务完成。实战案例
以下是一个使用线程池在多核系统上执行并发任务的示例:
#include <iostream> #include <vector> #include "thread_pool.h" int main() { ThreadPool pool(4); std::vector<std::future<int>> futures; for (int i = 0; i < 10000; i++) { futures.push_back(pool.add_task([i]() { return i * i; })); } for (auto& f : futures) { std::cout << f.get() << std::endl; } return 0; }
结论
通过使用 std::thread
std::thread
untuk mencipta utas baharu: 🎜rrreee🎜Untuk menyertai utas, gunakan kaedah join()
: 🎜rrreee🎜🎜Thread pengurusan kolam 🎜🎜🎜Kolam benang ialah koleksi utas yang telah dibuat dan terurus yang boleh digunakan untuk memproses tugasan. Menggunakan kumpulan benang mengelakkan overhed mencipta dan memusnahkan benang berulang kali. 🎜🎜Begini cara untuk mencipta dan mengurus kumpulan benang dalam C++: 🎜rrreee🎜Untuk menggunakan kumpulan benang, anda boleh melakukan langkah berikut: 🎜add_task()
untuk menambah tugasan pada kumpulan benang. join()
atau stop()
untuk menutup kumpulan benang dan tunggu semua tugasan selesai. std ::thread code> dan kumpulan benang, boleh mengurus tugas serentak dalam C++ dengan berkesan. Sama ada pengkomputeran saintifik pada sistem berbilang teras atau perkhidmatan web yang perlu mengendalikan sejumlah besar permintaan, penjadualan benang dan pengurusan kumpulan benang adalah kunci untuk meningkatkan kecekapan dan kebolehskalaan kod. 🎜
Atas ialah kandungan terperinci Pengaturcaraan serentak C++: bagaimana untuk melaksanakan penjadualan tugas dan pengurusan kolam benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!