在单一生产者单一消费者模型中生成图像

时间:2013-12-22 14:23:16

标签: c++ multithreading locking producer-consumer lock-free

我有以下设置:网页正在生成在C ++中实现的服务器上呈现的图像请求。生成图像的对象初始化非常昂贵,因此它在服务器上保持初始化为3-4份。

同时通常会有大约10个图像请求,因此需要锁定对象的副本。

问题是对象需要锁定相当长的时间~0.5-1.0秒,直到图像完成渲染。目前所做的是对象的每个副本都有一系列锁,并且图像请求以随机方式分配给特定副本。

使用mutrace进行基准测试显示锁的争用:

mutrace:总运行时间为127612.949 ms。 mutrace:显示10个最有争议的互斥体:

+-----------------------------------------------------------------------------------+
|  Mutex#   Locked  Changed    Cont. tot.Time[ms] avg.Time[ms] max.Time[ms]  Flags  |
+-----------------------------------------------------------------------------------+
|    65027  5129457   387745    79148      754.146        0.000        8.045 M-.--. |
|   443324   754545   172260    25960     7984.958        0.011       43.426 Mx.--. |
|    20645  1728872     5531      412      579.019        0.000        5.091 M-.--. |
|   540024      453      406      280    50068.601      110.527      830.096 M-.--. |
|   539797      462      413      254    39928.156       86.425      834.889 M-.--. |
|   540460      475      419      244    34194.536       71.988      698.798 M-.--. |
|   299764     3036     2091      215      149.902        0.049       11.128 Mx.--. |
|   491395      108       94       87      545.591        5.052       58.174 M-.--. |
|   518584    41440     1744       79      367.372        0.009        6.292 M-.--. |
|   487295    48304     5491       69      250.457        0.005       64.186 M-.--. |
+-----------------------------------------------------------------------------------+

基本上锁539797,539797,540460在整个时间都很满足。我正在考虑为生成图像的每个对象使用单个生产者/单个消费者无锁队列,这里大致是伪代码:

每当图像请求到达服务器时,都会使用一些图像参数调用回调:

function serverCallBack(params imageParams) {        
    queueId = imageParams.getQueueId()
    queues[queueId].put(imageParams)
    result = getImage()
    return image
}

我被困住的地方是我们需要一种方法来在对象完成渲染时获得结果图像。关于如何实现这个的任何想法?

澄清

很明显,如果请求多于对象,则会阻止某些请求。问题是天气可以以比使用互斥锁更有效的方式实现阻塞

0 个答案:

没有答案