本文共 2004 字,大约阅读时间需要 6 分钟。
并发:指同一时间段内交替处理多个操作
并行:指同一时间段内同时处理多个操作如果程序设计为可以并发执行的结构,那么在支持并行的机器上,程序可以并行执行。
多个进程独立运行,它们通过进程间通信(如信号、套接字、文件、管道等)传递信息。
进程间通信需要一定的开销,包括进程启动时间和资源消耗。多进程开发需要确保进程间的安全性,但由于保护措施较为复杂,编写并发代码具有一定难度。多线程是指在单个进程内运行多个线程。线程比进程轻量级,但共享地址空间,需确保线程间数据的一致性。
线程间通常共享内存,但缺乏保护机制,因此需要通过锁机制来保证数据的安全性。C++11 标准引入了新的线程库,包含以下组件:
创建线程:
std::thread t; // 空线程std::thread t1(f, n + 1); // 通过函数 f 传递参数std::thread t2(std::ref(n)); // 通过引用传递参数std::thread t3 = std::move(t2); // t3 已经运行,t2 已不再是线程
线程状态管理:
// 等待线程完成t.join();// 检测线程是否可执行if (t.joinable()) { // 可以操作}// 处置线程t.detach();析构函数特殊情况:
~thread() { if (joinable()) { _XSTD::terminate(); }}joinable() 为 false 的线程(如被 detach 后的线程)不会触发 terminate()。
future 提供异步操作的结果访问机制,适用于单线程环境。
使用 async() 创建 future:
std::future result = std::async([]() { std::this_thread::sleep_for(std::chrono::milliseconds(500)); return 8;});std::cout << "结果:" << result.get() << std::endl; 注意:future.get() 会阻塞,建议在多线程中使用 shared_future。
shared_future 可以关联多个 future,适用于多线程环境:
std::shared_future result = std::async([]() { std::this_thread::sleep_for(std::chrono::milliseconds(500)); return 8;});result.wait(); C++ 提供了丰富的多线程开发工具和库,支持多进程和多线程并发。通过合理使用互斥量和原子操作,可以在多线程环境中安全地共享数据。异步任务和 future 提供了对多线程应用的更高层次支持。
转载地址:http://fnuh.baihongyu.com/