Demonstrates three usage patterns: minimal thread pool without any services, full composition with ILogger and IMonitor registered in the global service_container, and dynamic service registration at runtime.
#include <iostream>
#include <chrono>
#include <thread>
#include <kcenon/common/interfaces/logger_interface.h>
#include <kcenon/common/interfaces/global_logger_registry.h>
#include <kcenon/common/interfaces/monitoring_interface.h>
public:
using log_entry = kcenon::common::interfaces::log_entry;
std::cout <<
"[" <<
level_to_string(level) <<
"] " << message << std::endl;
return VoidResult::ok({});
}
std::string_view message,
<< loc.file_name() << ":" << loc.line() << " (" << loc.function_name() << ") - "
<< message << std::endl;
return VoidResult::ok({});
}
<< entry.file << ":" << entry.line << " (" << entry.function << ") - "
<< entry.message << std::endl;
return VoidResult::ok({});
}
return true;
}
return VoidResult::ok({});
}
}
std::cout.flush();
return VoidResult::ok({});
}
private:
return std::string(kcenon::common::interfaces::to_string(level));
}
};
public:
std::cout << "[MONITORING] " << name << ": " << value << std::endl;
return kcenon::common::ok();
}
const std::string& name,
double value,
const std::unordered_map<std::string, std::string>& tags) override {
std::cout << "[MONITORING] " << name << ": " << value;
if (!tags.empty()) {
std::cout << " {";
bool first = true;
for (const auto& [k, v] : tags) {
if (!first) std::cout << ", ";
std::cout << k << "=" << v;
first = false;
}
std::cout << "}";
}
std::cout << std::endl;
kcenon::common::interfaces::metric_value mv(name, value);
mv.tags = tags;
return kcenon::common::ok();
}
kcenon::common::Result<kcenon::common::interfaces::metrics_snapshot>
get_metrics()
override {
}
kcenon::common::Result<kcenon::common::interfaces::health_check_result>
check_health()
override {
kcenon::common::interfaces::health_check_result
result;
result.status = kcenon::common::interfaces::health_status::healthy;
result.message =
"Console monitoring active";
return kcenon::common::ok(
result);
}
return kcenon::common::ok();
}
private:
kcenon::common::interfaces::metrics_snapshot
snapshot_;
};
std::cout << "\n=== Composition-Based Thread System Demo ===\n" << std::endl;
auto& container = service_container::global();
container.register_singleton<kcenon::common::interfaces::ILogger>(
std::make_shared<console_logger>());
container.register_singleton<kcenon::common::interfaces::IMonitor>(
std::make_shared<console_monitoring>());
auto pool = std::make_shared<thread_pool>("CompositionPool", context);
std::vector<std::unique_ptr<thread_worker>> workers;
for (int i = 0; i < 4; ++i) {
workers.push_back(std::make_unique<thread_worker>());
}
{
auto r = pool->enqueue_batch(std::move(workers));
if (r.is_err()) {
std::cerr << "enqueue_batch failed: " << r.error().message << std::endl;
return;
}
}
{
auto r = pool->start();
if (r.is_err()) {
std::cerr << "start failed: " << r.error().message << std::endl;
return;
}
}
for (int i = 0; i < 10; ++i) {
auto r = pool->enqueue(std::make_unique<callback_job>(
[i, &context]() -> kcenon::common::VoidResult {
context.log(log_level_v2::info,
"Processing job " + std::to_string(i));
std::this_thread::sleep_for(std::chrono::milliseconds(100));
return kcenon::common::ok();
}
));
if (r.is_err()) {
std::cerr << "enqueue failed: " << r.error().message << std::endl;
}
}
std::this_thread::sleep_for(std::chrono::seconds(2));
{
auto r = pool->stop();
if (r.is_err()) {
std::cerr << "stop failed: " << r.error().message << std::endl;
}
}
std::cout << "\n=== Basic Thread Pool Demo Complete ===\n" << std::endl;
}
std::cout << "\n=== Minimal Thread Pool (No Services) Demo ===\n" << std::endl;
service_container::global().clear();
auto pool = std::make_shared<thread_pool>("MinimalPool");
std::vector<std::unique_ptr<thread_worker>> workers;
for (int i = 0; i < 2; ++i) {
workers.push_back(std::make_unique<thread_worker>());
}
{
auto r = pool->enqueue_batch(std::move(workers));
if (r.is_err()) {
std::cerr << "enqueue_batch failed: " << r.error().message << std::endl;
return;
}
}
{
auto r = pool->start();
if (r.is_err()) {
std::cerr << "start failed: " << r.error().message << std::endl;
return;
}
}
std::atomic<int> counter{0};
for (int i = 0; i < 5; ++i) {
auto r = pool->enqueue(std::make_unique<callback_job>(
[&counter]() -> kcenon::common::VoidResult {
counter.fetch_add(1);
return kcenon::common::ok();
}
));
if (r.is_err()) {
std::cerr << "enqueue failed: " << r.error().message << std::endl;
}
}
std::this_thread::sleep_for(std::chrono::milliseconds(500));
{
auto r = pool->stop();
if (r.is_err()) {
std::cerr << "stop failed: " << r.error().message << std::endl;
}
}
std::cout << "Completed " << counter.load() << " jobs without any logging/monitoring" << std::endl;
std::cout << "\n=== Minimal Demo Complete ===\n" << std::endl;
}
try {
service_container::global().clear();
std::cout << "\nAll demos completed successfully!" << std::endl;
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
return 1;
}
return 0;
}
Specialized job class that encapsulates user-defined callbacks.
Simple console logger implementation using common_system ILogger.
common_log_level min_level_
kcenon::common::source_location source_location
kcenon::common::VoidResult VoidResult
VoidResult flush() override
VoidResult log(common_log_level level, const std::string &message) override
bool is_enabled(common_log_level) const override
common_log_level get_level() const override
kcenon::common::interfaces::log_entry log_entry
VoidResult set_level(common_log_level level) override
std::string level_to_string(common_log_level level) const
Simple monitoring implementation using common::interfaces::IMonitor.
kcenon::common::interfaces::metrics_snapshot snapshot_
kcenon::common::Result< kcenon::common::interfaces::metrics_snapshot > get_metrics() override
kcenon::common::VoidResult VoidResult
VoidResult reset() override
kcenon::common::Result< kcenon::common::interfaces::health_check_result > check_health() override
VoidResult record_metric(const std::string &name, double value) override
A template class representing either a value or an error.
Context object that provides access to optional services.
void demonstrate_composition()
Demonstrate composition-based design.
void demonstrate_minimal_usage()
Demonstrate using thread pool without any services.
kcenon::common::interfaces::log_level common_log_level
Core thread pool implementation with work stealing and auto-scaling.
Logging severity levels for the thread system.
Core threading foundation of the thread system library.
Service container for dependency injection within the thread system.
Context object providing access to optional thread system services.