最好是锁定共享资源,还是有线程来满足请求?

时间:2011-08-07 20:22:23

标签: c locking pthreads mutex task-queue

我有一个共享内存池,许多不同的线程可以从中请求分配。从这个请求分配将在每个线程中发生很多,但是线程的数量可能很小,通常只有1个线程在运行。我不确定以下哪种方法可以解决这个问题。

最终我可能需要实现两者并看看哪个会产生更有利的结果......我也担心即使考虑#2也可能在此时过早优化,因为我实际上没有使用此共享资源的代码写了。但问题是如此有趣,以至于它继续让我分心于其他工作。

1)创建互斥锁并让线程尝试在获取分配之前将其锁定,然后将其解锁。

2)让每个线程注册一个请求槽,当需要分配时,它将请求放入槽中,然后阻塞(while(result == NULL){usleep()})等待请求槽有一个结果。单个线程连续迭代请求时隙,进行分配并将它们分配给请求时隙中的结果。

1号是简单的解决方案,但如果时机正确,单个线程可能会占用锁。第二个更复杂,但是当从资源中提取时,确保线程之间的公平性。但是它仍然会阻塞请求线程,如果有很多线程,迭代可以在没有进行任何实际分配的情况下刻录周期,直到找到要满足的请求。

注意:使用pthreads在Linux上使用C

1 个答案:

答案 0 :(得分:6)

解决方案2是假的。这是一个丑陋的黑客,它不能确保内存同步。

我会说解决方案1,但我有点怀疑你提到“内存池”的事实。你只是想分配内存,还是你正在管理的其他资源(例如某些特殊内存中的插槽,内存映射文件,视频内存中的纹理等)?

如果你只是分配内存,那么你担心过早优化是完全正确的。整个问题是过早优化,系统malloc的效果与内存池相同或更好。 (或者,如果您的代码将在少数几个视频游戏控制台上具有病态破坏malloc的系统之一上运行,只需在已知损坏的系统上插入替换。)

如果您确实需要管理特殊资源,请从解决方案1开始,看看它是如何工作的。如果您遇到问题,您可能会发现可以使用条件变量来改进它,资源管理器会在分配插槽时通知您,但我真的怀疑这是必要的。