Exo*_*ist 0 c mutex locking pthreads task-queue
我有一个共享内存池,许多不同的线程可以从中请求分配.从这个请求分配将在每个线程中发生很多,但是线程的数量可能很小,通常只有1个线程在运行.我不确定以下哪种方法可以解决这个问题.
最终我可能需要实现两者并看看哪个产生更有利的结果......我也担心即使考虑#2也可能是过早的优化,因为我实际上并没有使用这个共享资源编写的代码.但问题是如此有趣,以至于它继续分散我对其他工作的注意力.
1)创建互斥锁并让线程在获取分配之前尝试锁定它,然后解锁它.
2)让每个线程注册一个请求槽,当需要分配时,它将请求放入槽中,然后阻塞(while(result == NULL){usleep()})等待请求槽有结果.单个线程连续迭代请求时隙,进行分配并将它们分配给请求时隙中的结果.
数字1是简单的解决方案,但如果时机正确,单个线程可能会占用锁定.第二个更复杂,但是当从资源中提取时,确保线程之间的公平性.但是它仍然会阻塞请求线程,如果有很多线程,迭代可以在没有进行任何实际分配的情况下刻录周期,直到找到要满足的请求.
注意:使用pthreads在Linux上使用C语言
解决方案2是假的.这是一个丑陋的黑客,它不能确保内存同步.
我会说解决方案1,但我有点怀疑你提到"内存池"的事实.你只是试图分配内存,还是你正在管理的其他资源(例如某些特殊内存中的插槽,内存映射文件,视频内存中的纹理等)?
如果你只是分配内存,那么你担心过早优化是完全正确的.整个问题是过早优化,系统malloc将比你的内存池做得更好或更好.(或者,如果您的代码将在少数malloc像某些视频游戏控制台那样具有病态破坏的系统之一上运行,那么只需在那些已知损坏的系统上进行替换即可.)
如果您确实需要管理特殊资源,请从解决方案1开始,看看它是如何工作的.如果您遇到问题,您可能会发现可以使用条件变量来改进它,资源管理器会在分配插槽时通知您,但我真的怀疑这是必要的.