也许有人会觉得多线程和并发难用,复杂,还会让代码出现各种各样的问题,不过,其实它是一个强有力的工具,能让程序充分利用硬件资源,让程序运行得更快。
何谓并发:
两个或更多独立得活动同时发生。计算机中就是单个系统同时执行多个独立的任务,通过这个任务做一会儿,再切换到别的任务再做一会儿的方式,让任务看起来是并行执行的。切换就是做上下文切换,会有时间开销,操作系统为当前运行的任务保存CPU的状态和指针,计算出要切换到哪一个任务,并为即将切换到的任务重新加载处理器状态。
并发的方式:
多进程并发 多线程并发
多进程并发:
类似同一时刻,同时运行网页浏览器,QQ,word这种方式属于多进程并发。进程之间通过管道,套接字,文件等方式进行通信。
多线程并发:
在单个进程中运行多个线程。进程中的所有线程共享地址空间。
为什么使用并发:
1:关注点分离
2:提高性能
何时不使用并发:
基本上,不使用并发的唯一原因就是,收益比不上成本。使用并发的代码在很多情况下难以理解,因此编写和维护的多线程代码就会产生直接的脑力成本,同时额外的复杂性也可能引起更多的错误。除非潜在的性能增益足够大或关注点分离地足够清晰,能抵消所需的额外的开发时间以及与维护多线程代码相关的额外成本(代码正确的前提下);否则,别用并发。此外,线程是有限的资源。如果让太多的线程同时运行,则会消耗很多操作系统资源,从而使得操作系统整体上运行得更加缓慢。
一个简单的并发例子:
// hello.cpp
#include <iostream> #include <thread> // 支持多线程的头文件 using namespace std; void thread_func() // 子线程入口函数 { cout << "hello thread" <<endl; } int main() { thread my_job(thread_func); my_job.join(); // 主线程等子线程执行完毕再继续执行 cout << "hello main" << endl; return 0; }
# CMakeLists.txt cmake_minimum_required(VERSION 3.5.1) set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -march=native -O3 -pthread" ) project(thread_test) add_executable(thread_test1 hello.cpp)