在Linux下,C++程序可以通过多种方式利用多核处理器来提升性能。以下是一些关键技术和方法:
使用C++11标准库中的<thread>
头文件可以轻松创建和管理线程。
#include <iostream> #include <thread> #include <vector> void threadFunction(int id) { std::cout << "Thread " << id << " is running\n"; } int main() { const int numThreads = 4; std::vector<std::thread> threads; for (int i = 0; i < numThreads; ++i) { threads.emplace_back(threadFunction, i); } for (auto& t : threads) { t.join(); } return 0; }
C++17引入了并行算法库,可以在多个线程上执行标准库算法。
#include <iostream> #include <vector> #include <algorithm> #include <execution> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用并行算法进行排序 std::sort(std::execution::par, vec.begin(), vec.end()); for (int num : vec) { std::cout << num << " "; } std::cout << std::endl; return 0; }
OpenMP是一个用于共享内存并行编程的API,可以通过编译器指令轻松实现并行化。
#include <iostream> #include <omp.h> int main() { #pragma omp parallel for for (int i = 0; i < 10; ++i) { std::cout << "Thread " << omp_get_thread_num() << " is running iteration "<< i << "\n"; } return 0; }
编译时需要添加-fopenmp
标志:
g++ -fopenmp -o parallel_example parallel_example.cpp
MPI是一种用于分布式内存并行编程的标准,适用于多台机器上的并行计算。
#include <mpi.h> #include <iostream> int main(int argc, char** argv) { MPI_Init(&argc, &argv); int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); std::cout << "Hello from process " << rank << "\n"; MPI_Finalize(); return 0; }
编译时需要使用mpic++
或mpicxx
:
mpic++ -o mpi_example mpi_example.cpp
使用C++11的std::async
和std::future
可以实现异步任务。
#include <iostream> #include <future> int asyncFunction(int id) { std::this_thread::sleep_for(std::chrono::seconds(1)); return id * id; } int main() { std::future<int> result = std::async(std::launch::async, asyncFunction, 5); // 可以在这里执行其他任务 std::cout << "Result: " << result.get() << "\n"; return 0; }
使用线程池可以更高效地管理线程,避免频繁创建和销毁线程的开销。
#include <iostream> #include <vector> #include <thread> #include <queue> #include <functional> #include <mutex> #include <condition_variable> #include <future> class ThreadPool { public: ThreadPool(size_t threads) : stop(false) { for (size_t i = 0; i < threads; ++i) { workers.emplace_back([this] { while (true) { 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, class... Args> auto enqueue(F&& f, Args&&... args) -> std::future<typename std::result_of<F(Args...)>::type> { using return_type = typename std::result_of<F(Args...)>::type; auto task = std::make_shared<std::packaged_task<return_type()>>( std::bind(std::forward<F>(f), std::forward<Args>(args)...) ); std::future<return_type> res = task->get_future(); { std::unique_lock<std::mutex> lock(queue_mutex); if (stop) { throw std::runtime_error("enqueue on stopped ThreadPool"); } tasks.emplace([task]() { (*task)(); }); } condition.notify_one(); return res; } ~ThreadPool() { { std::unique_lock<std::mutex> lock(queue_mutex); stop = true; } condition.notify_all(); for (std::thread& worker : workers) { worker.join(); } } private: std::vector<std::thread> workers; std::queue<std::function<void()>> tasks; std::mutex queue_mutex; std::condition_variable condition; bool stop; }; int main() { ThreadPool pool(4); auto result = pool.enqueue([](int answer) { return answer; }, 42); std::cout << "Result: " << result.get() << "\n"; return 0; }
通过这些方法,C++程序可以在Linux下充分利用多核处理器的性能。选择合适的方法取决于具体的应用场景和需求。