我有以下设置:网页正在生成在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
}
我被困住的地方是我们需要一种方法来在对象完成渲染时获得结果图像。关于如何实现这个的任何想法?
很明显,如果请求多于对象,则会阻止某些请求。问题是天气可以以比使用互斥锁更有效的方式实现阻塞