C++ 多线程编程总结
上一篇 / 下一篇 2012-05-22 09:58:27 / 个人分类:C++
u$mNq'v!R(rI%V0 ● 并发51Testing软件测试网:}CQ2w7S8j
?9h@cN/`2{H0 ● 异步51Testing软件测试网'V5BV#\+s&DiD
51Testing软件测试网Z,Gr Ujj;G● 缓存
FzK7pc:q c05\2jHz6c0 下面将我平常工作中遇到一些问题例举一二,其设计思想无非以上三点。51Testing软件测试网Yuf1Bpy
51Testing软件测试网 b`0ox \8^U1、任务队列
'SRK-G|\&JB0)k8d!FV[#pn,Q0 1.1 以生产者-消费者模型设计任务队列51Testing软件测试网!L*k)~Tb
51Testing软件测试网g(mbv$kCw生产者-消费者模型是人们非常熟悉的模型,比如在某个服务器程序中,当User数据被逻辑模块修改后,就产生一个更新数据库的任务(produce),投递给IO模块任务队列,IO模块从任务队列中取出任务执行sql操作(consume)。51Testing软件测试网C,Y,E_e:G]3`
1f fT"YgW0 设计通用的任务队列,示例代码如下:51Testing软件测试网KB'h zH;M-B6Zkj.@
51Testing软件测试网8bXZ0E0ybt F i详细实现可参见:http://ffown.googlecode.com/svn/trunk/fflib/include/detail/task_queue_impl.h
#Z;b0a1G Y^0
|
'{s'hN#Ts,|"c)A0 1.2 任务队列使用技巧
/u9g$A_U d8?&Gpw+P%v|0/^G ^{d!ZGtn0Y0 1.2.1 IO 与 逻辑分离51Testing软件测试网)i1^X:vO+]'s?k5Q
5g4G/D(d.r\7Ll8`x d8v0 比如网络游戏服务器程序中,网络模块收到消息包,投递给逻辑层后立即返回,继续接受下一个消息包。逻辑线程在一个没有io操作的环境下运行,以保障实时性。示例:
7]:RCN5K,f0
|
!b[k-nBp e'je0 注意,此模式下为单任务队列,每个任务队列单线程。
O1x$T5Q ]1n,Xg051Testing软件测试网^:~SI.`\3_S\#A8}1.2.2 并行流水线
}U,la` d5xAu0/`!N~,B2H7d0 上面的只是完成了io 和 cpu运算的并行,而cpu中逻辑操作是串行的。在某些场合,cpu逻辑运算部分也可实现并行,如游戏中用户A种菜和B种菜两种操作是完全可以并行的,因 为两个操作没有共享数据。最简单的方式是A、B相关的操作被分配到不同的任务队列中。示例如下:
8j9M6sQ7Q J0
|
注意,此模式下为多任务队列,每个任务队列单线程。51Testing软件测试网"z)@V%I6BG
1.2.3 连接池与异步回调*Y Bo6T oz@8I N0 比如逻辑Service模块需要数据库模块异步载入用户数据,并做后续处理计算。而数据库模块拥有一个固定连接数的连接池,当执行SQL的任务到来时,选择一个空闲的连接,执行SQL,并把SQL 通过回调函数传递给逻辑层。其步骤如下:51Testing软件测试网n*Pt |]
,Y x:Hl ?t3V0 ● 预先分配好线程池,每个线程创建一个连接到数据库的连接
FsH)rqt2]i$\051Testing软件测试网}q*r,M#VP\● 为数据库模块创建一个任务队列,所有线程都是这个任务队列的消费者51Testing软件测试网*Fi~/ro Uw,_!v
@ LX e/c}An1S0 ● 逻辑层想数据库模块投递sql执行任务,同时传递一个回调函数来接受sql执行结果51Testing软件测试网#f,DYN5{hH
51Testing软件测试网9`eoo'KME示例如下:
1Xh4t*Qqo~};X0^+ZE3w.^0