Pengaturcaraan serentak C++: bagaimana untuk melaksanakan penjadualan tugas dan pengurusan kolam benang?

WBOY
Lepaskan: 2024-05-06 10:15:02
asal
1034 orang telah melayarinya

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.

Pengaturcaraan serentak C++: bagaimana untuk melaksanakan penjadualan tugas dan pengurusan kolam 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::threadstd::mutex 来管理线程池。

任务调度

任务调度涉及分配和执行异步任务。在 C++ 中,可以使用 std::thread 来创建新线程:

std::thread t([]() {
  // 执行异步任务
});
Salin selepas log masuk

要加入线程,请使用 join() 方法:

t.join();
Salin selepas log masuk

线程池管理

线程池是一个预先创建并管理的线程集合,可用于处理任务。使用线程池可以避免反复创建和销毁线程的开销。

以下是如何在 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;
};
Salin selepas log masuk

要使用线程池,可以执行以下步骤:

  1. 创建一个线程池对象,指定要创建的线程数。
  2. 使用 add_task() 方法将任务添加到线程池。
  3. 调用 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;
}
Salin selepas log masuk

结论

通过使用 std::thread

🎜Penjadualan Tugas🎜🎜🎜Penjadualan tugas melibatkan pengagihan dan pelaksanaan tugas tak segerak. Dalam C++, anda boleh menggunakan 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: 🎜
  1. Buat objek kumpulan benang, menyatakan bilangan utas untuk dibuat .
  2. Gunakan kaedah add_task() untuk menambah tugasan pada kumpulan benang.
  3. Panggil kaedah join() atau stop() untuk menutup kumpulan benang dan tunggu semua tugasan selesai.
🎜🎜Kes praktikal🎜🎜🎜Berikut ialah contoh penggunaan kumpulan benang untuk melaksanakan tugas serentak pada sistem berbilang teras: 🎜rrreee🎜🎜Kesimpulan🎜🎜🎜Dengan menggunakan 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!

Label berkaitan:
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan