为什么要用并发编程

使用并发的原因

使用并发主要由两个原因:模块划分和性能。

1、使用并发来划分模块

在编程时划分模块是一个好的想法,把相关的代码写到一起,不相关的代码分开。这样的话你的代码就易懂、容易测试,而且可以减少bug。你可以使用并发把不同功能的代码分开,及时这些操作可能会同时执行。如果不使用并发的话,你就必须写一个任务切换的架构,或者在某处调用不相关的代码。

2、使用并发来提高性能

多核处理器的发展促进了并发编程。如果软件想要使用不断增强的处理器处理能力,必须使用多任务并发编程。
有2中方式来使用并发编程。第1种:这也是最常用的,把一个任务分解为多个任务,并发的执行这些分解的任务,这样就能减少总的运行时间。这叫做任务并行(task parallelism)。这个听起来很直接简单,但是这可能是一个复杂的处理过程;因为任务的不同部分之间可能有依赖关系。任务的分解或许依据处理过程:一个线程执行算法的一部分,另一个线程执行算法的其他部分;或者依据数据:每个线程运行相同的算法,但是处理的数据不同,这叫做数据并行(data parallelism)。

3、什么时候不使用并发

知道什么情况下不使用并发同样重要。从根本上来说,不使用并发的唯一原因就是并发带来的效益小于它带来的代价。在许多情况下,使用并发会使代码难以理解,编写、维护并发代码需要更多的脑力成本,并发带来的复杂性可能会增加bug。除非并发带来性能的提升足够打,或者模块划分足够清楚,否则不要使用并发。
使用并发带来性能上的提升可能不如预期。并发编程也需要额外的开销,在创建一个线程时,系统要分配内核资源、栈空间,然后把新线程加入到任务队列。如果线程运行时间小于线程的创建时间,这时使用多线程可能会使性能变差。
进一步来说,线程资源是有限的。如果同时有太多线程,会占用太多系统资源,会使整个系统变慢。使用太多线程会消耗尽内存或处理器的地址空间,因为线程需要独立的栈空间。
在C/S架构下,如果为每个连接创建一个线程,在连接比较少时性能很好,但是如果要同时处理太多连接的话会创建太多线程。这时使用线程池(thread pools)可以提高性能。在Linux下可以使用I/O多路复用:select、poll、epoll。
线程的切换也需要时间,如果线程切换时间比线程运行时间还短,就会降低整体性能。

使用并发是个双刃剑:它可能会提升软件的性能,也可能使代码更复杂难以理解、包含更多bug。

在C++中使用并发和多线程

C++11已经支持并发和多线程了,这样就不再有平台的限制了。C++11在多线程方面的新内容有线程感知(thread-aware)内存模型、线程管理、保护共享数据、线程间同步、低级原子操作。
C++的线程库依赖以前的C++库,尤其是Boost的线程库,它们在使用上有许多相似之处。

下面来看一个例子
#include<iostream>
#include<thread>
void hello()
{
	std::cout<<"hello concurrent world\n";
}
int main()
{
	std::thread t(hello);
	t.join();
}

这个例子很简单,创建一个线程,新线程执行hello函数,主线程等待新线程结束。
需要注意的是,如果使用VS编译器,要使用VS2012以上的版本才支持C++11。如果使用G++,也要加上-Wl,--no-as-needed -std=c++11 -lpthread才可以。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值