在C++中,使用函数对象(也称为仿函数或functor)进行并发编程时,可以利用多线程库(如std::thread
)来执行多个任务。以下是一个简单的示例,展示了如何使用函数对象和std::thread
实现并发编程:
#include
#include
#include
// 定义一个简单的函数对象
struct MyFunctor {
void operator()(int start, int end) const {
for (int i = start; i <= end; ++i) {
std::cout << "Thread ID: " << std::this_thread::get_id() << ", Value: "<< i << std::endl;
}
}
};
int main() {
const int num_threads = 4;
const int range = 100;
// 创建一个包含多个函数对象的向量
std::vector functors(num_threads);
// 计算每个线程的工作范围
int chunk_size = range / num_threads;
// 使用std::thread执行并发任务
std::vector threads;
for (int i = 0; i < num_threads; ++i) {
int start = i * chunk_size + 1;
int end = (i == num_threads - 1) ? range : start + chunk_size - 1;
threads.emplace_back(functors[i], start, end);
}
// 等待所有线程完成
for (auto& t : threads) {
t.join();
}
return 0;
}
在这个示例中,我们定义了一个名为MyFunctor
的函数对象,它接受两个整数参数(开始值和结束值),并在其operator()
方法中打印线程ID和值。在main
函数中,我们创建了4个线程,并将MyFunctor
对象分配给它们。每个线程负责打印一个范围内的值。最后,我们等待所有线程完成,然后程序退出。
请注意,这个示例仅用于演示目的。在实际应用中,你可能需要考虑线程安全、同步和资源管理等问题。C++11及更高版本提供了std::async
和std::packaged_task
等高级并发工具,可以简化并发编程。