Mövzunu Açan
#0
Birçok modern uygulama, performansı artırmak ve kaynakları daha verimli kullanmak amacıyla çok iş parçacıklı (multi-threaded) yapılar kullanmaktadır. C++ dilinde thread pool (iş parçacığı havuzu) oluşturmak, bu tür uygulamalarda iş parçacığı yönetimini kolaylaştırır. Bu yazıda, basit bir C++ thread pool örneği üzerinden bu yapının nasıl oluşturulacağına dair detaylı bir inceleme gerçekleştireceğiz.
Thread pool, belirli sayıda iş parçacığını önceden oluşturup, bu parçacıkları iş yükü geldiğinde kullanarak yeni parçacık oluşturma süresinden tasarruf sağlar. Böylece, uygulamanız daha hızlı tepki verebilir. Aşağıda, temel bir thread pool yapısını oluşturan adımları bulabilirsiniz:
Aşağıda, temel bir thread pool implementasyonu için örnek bir kod parçası bulunmaktadır:
Bu örnek, temel bir thread pool yapısını göstermektedir. Kullanımı oldukça basittir; sadece iş parçacığı havuzunu oluşturup,
Thread pool, belirli sayıda iş parçacığını önceden oluşturup, bu parçacıkları iş yükü geldiğinde kullanarak yeni parçacık oluşturma süresinden tasarruf sağlar. Böylece, uygulamanız daha hızlı tepki verebilir. Aşağıda, temel bir thread pool yapısını oluşturan adımları bulabilirsiniz:
- İş Parçacığı Sınıfı: Öncelikle, iş parçacıklarının yöneteceği işlerin tanımlandığı bir sınıf oluşturmalıyız. Bu sınıf, işin yapılacağı fonksiyonları ve gerekli parametreleri içermelidir.
- Havuz Sınıfı: İş parçacıklarını yöneten bir havuz sınıfı tasarlamalıyız. Bu sınıf, iş parçacıklarını oluşturacak ve işlerin kuyruğa alınmasını sağlayacak. Ayrıca, iş parçacıklarını yönetmek için bir mutex ve bir koşul değişkeni kullanacağız.
- İş Kuyruğu: İşlerin sırayla işlenmesi için bir kuyruğa ihtiyacımız var. Bu kuyruk, iş parçacıkları tarafından paylaşılacak ve iş parçacıkları, bu kuyruktan işleri alarak işleyecek.
Aşağıda, temel bir thread pool implementasyonu için örnek bir kod parçası bulunmaktadır:
CODE
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960#include <iostream>
#include <vector>
#include <thread>
#include <queue>
#include <functional>
#include <mutex>
#include <condition_variable>
class ThreadPool {
public:
ThreadPool(size_t);
template<class F>
void enqueue(F&& f);
~ThreadPool();
private:
std::vector<std::thread> workers;
std::queue<std::function<void()>> tasks;
std::mutex queue_mutex;
std::condition_variable condition;
bool stop;
};
ThreadPool::ThreadPool(size_t threads) : stop(false) {
for (size_t i = 0; i < threads; ++i)
workers.emplace_back([this] {
for (;;) {
std::function<void()> task;
{
std::unique_lock<std::mutex> lock(this->queue_mutex);
this->condition.wait(lock, [this] { return this->stop || !this->tasks.empty(); });
if (this->stop && this->tasks.empty())
return;
task = std::move(this->tasks.front());
this->tasks.pop();
}
task();
}
});
}
template<class F>
void ThreadPool::enqueue(F&& f) {
{
std::unique_lock<std::mutex> lock(queue_mutex);
tasks.emplace(std::forward<F>(f));
}
condition.notify_one();
}
ThreadPool::~ThreadPool() {
{
std::unique_lock<std::mutex> lock(queue_mutex);
stop = true;
}
condition.notify_all();
for (std::thread &worker: workers)
worker.join();
}Bu örnek, temel bir thread pool yapısını göstermektedir. Kullanımı oldukça basittir; sadece iş parçacığı havuzunu oluşturup,
enqueue metodu ile işlerinizi eklemeniz yeterli. Thread pool kullanarak, iş yükünüzü daha verimli bir şekilde yönetebilir ve uygulamanızın performansını artırabilirsiniz.