在Linux下使用C++进行并发编程,主要有以下几种方式:
POSIX Threads 是一种标准的线程库,可以在大多数类Unix系统上使用。
包含头文件:
#include <pthread.h> 定义线程函数:
void* thread_function(void* arg) { // 线程执行的代码 return NULL; } 创建线程:
pthread_t thread_id; int result = pthread_create(&thread_id, NULL, thread_function, NULL); if (result != 0) { // 处理错误 } 等待线程结束:
pthread_join(thread_id, NULL); #include <iostream> #include <pthread.h> void* thread_function(void* arg) { std::cout << "Thread is running" << std::endl; return NULL; } int main() { pthread_t thread_id; int result = pthread_create(&thread_id, NULL, thread_function, NULL); if (result != 0) { std::cerr << "Error creating thread" << std::endl; return 1; } pthread_join(thread_id, NULL); std::cout << "Thread finished" << std::endl; return 0; } C++11 引入了标准库线程支持,提供了更现代和易用的接口。
包含头文件:
#include <thread> 定义线程函数:
void thread_function() { // 线程执行的代码 } 创建线程:
std::thread t(thread_function); 等待线程结束:
t.join(); #include <iostream> #include <thread> void thread_function() { std::cout << "Thread is running" << std::endl; } int main() { std::thread t(thread_function); t.join(); std::cout << "Thread finished" << std::endl; return 0; } std::async 提供了一种更高级的方式来执行异步任务,它会自动管理线程的创建和销毁。
包含头文件:
#include <future> 定义任务函数:
int task_function() { // 任务执行的代码 return 42; } 启动异步任务:
std::future<int> result = std::async(std::launch::async, task_function); 获取任务结果:
int value = result.get(); #include <iostream> #include <future> int task_function() { std::cout << "Task is running" << std::endl; return 42; } int main() { std::future<int> result = std::async(std::launch::async, task_function); std::cout << "Waiting for task to finish..." << std::endl; int value = result.get(); std::cout << "Task finished with result: " << value << std::endl; return 0; } 在多线程编程中,条件变量和互斥锁是常用的同步机制。
#include <iostream> #include <thread> #include <mutex> #include <condition_variable> std::mutex mtx; std::condition_variable cv; bool ready = false; void worker_thread() { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, []{ return ready; }); std::cout << "Worker thread is processing data" << std::endl; } void trigger_work() { std::lock_guard<std::mutex> lock(mtx); ready = true; cv.notify_one(); } int main() { std::thread worker(worker_thread); std::this_thread::sleep_for(std::chrono::seconds(1)); trigger_work(); worker.join(); return 0; } 选择哪种方式取决于具体的需求和场景。