###封装代码
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>
#include <functional>
#include <atomic>
// 1. 定义你的信号量类(不变)
class vp_semaphore {
public:
vp_semaphore() : count_(0) {}
void signal() {
std::unique_lock<std::mutex> lock(mutex_);
++count_;
cv_.notify_one();
}
void wait() {
std::unique_lock<std::mutex> lock(mutex_);
cv_.wait(lock, [=] { return count_ > 0; });
--count_;
}
private:
std::mutex mutex_;
std::condition_variable cv_;
int count_;
};
class async_proc {
public:
using Task = std::function<void()>;
async_proc()
{
tid = std::thread([this]() {
while (live) {
semaphore_cv.wait();
if (!live)
break;
// std::lock_guard<std::mutex> lock(task_mtx); 可以不加 semaphore_cv中已经有对 task_que数量的判断
if (task_que.empty()) {
continue;
}
auto tsk = task_que.front();
task_que.pop();
tsk();
}
});
}
~async_proc()
{
live = false;
semaphore_cv.signal();
tid.join();
}
template <typename F, typename... Args> void post_task(F &&f, Args &&...args)
{
Task tsk = std::bind(std::forward<F>(f), std::forward<Args>(args)...);
std::lock_guard<std::mutex> lock(task_mtx);
task_que.push(tsk);
semaphore_cv.signal();
}
async_proc(const async_proc &) = delete;
async_proc &operator=(const async_proc &) = delete;
private:
std::queue<Task> task_que;
std::mutex task_mtx;
//声明为原子变量,确保在多线程环境下的安全访问
std::atomic<bool> live{true};
std::thread tid;
vp_semaphore semaphore_cv;
};
###使用示例
// 简单的函数示例
void print_hello() {
std::cout << "Hello from thread! Thread ID: " << std::this_thread::get_id() << std::endl;
}
// 带参数的函数示例
void print_message(const std::string& message, int number) {
std::cout << "Message: " << message << ", Number: " << number
<< " (Thread ID: " << std::this_thread::get_id() << ")" << std::endl;
}
// 带返回值的函数示例(在异步环境中返回值会被忽略,除非通过引用或指针传递)
void calculate_and_store(int a, int b, int& result) {
std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟耗时操作
result = a + b;
std::cout << "Calculated: " << a << " + " << b << " = " << result << std::endl;
}
int main() {
std::cout << "Main thread ID: " << std::this_thread::get_id() << std::endl;
// 创建异步处理器实例
async_proc processor;
// 示例1:提交无参函数
std::cout << "Submitting print_hello task..." << std::endl;
processor.post_task(print_hello);
// 示例2:提交带参数的函数
std::cout << "Submitting print_message task..." << std::endl;
processor.post_task(print_message, "Async task", 42);
// 示例3:提交Lambda表达式
std::cout << "Submitting lambda task..." << std::endl;
processor.post_task([]() {
std::cout << "Lambda executed! "
<< "Current time: " << std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()) << std::endl;
});
// 示例4:提交带状态的任务(使用引用传递结果)
int result = 0;
std::cout << "Submitting calculation task..." << std::endl;
processor.post_task(calculate_and_store, 10, 32, std::ref(result));
// 示例5:提交多个任务,展示并发执行
std::cout << "Submitting multiple tasks..." << std::endl;
for (int i = 0; i < 5; ++i) {
processor.post_task([i]() {
std::cout << "Batch task " << i << " executing..." << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(50)); // 模拟不同的执行时间
std::cout << "Batch task " << i << " completed." << std::endl;
});
}
// 等待所有任务完成
std::this_thread::sleep_for(std::chrono::seconds(1));
// 显示通过引用获取的计算结果
std::cout << "Final result from calculation: " << result << std::endl;
std::cout << "Main function completed." << std::endl;
return 0;
}