我有一个共享内存池,许多不同的线程可能会从中请求分配。从这个请求分配将在每个线程中发生很多,但是线程的数量可能很小,通常只有 1 个线程在运行。我不确定以下哪种方法更好。
最终,我可能需要同时实现两者,看看哪个会产生更有利的结果……我也担心此时即使考虑 #2 也可能是过早的优化,因为我实际上还没有编写使用此共享资源的代码。但是这个问题实在是太有趣了,以至于它继续分散我对其他工作的注意力。
1)创建一个互斥体并让一个线程在获得分配之前尝试锁定它,然后解锁它。
2)让每个线程注册一个请求槽,当它需要分配时,它将请求放入槽中,然后阻塞(while(result == NULL){usleep()})等待请求槽有结果。单个线程不断迭代请求槽进行分配并将它们分配给请求槽中的结果。
数字 1 是简单的解决方案,但如果时机合适,单个线程可能会占用锁。第二种更复杂,但在从资源中提取时确保线程之间的公平性。但是,它仍然会阻塞请求线程,并且如果有很多线程,迭代可能会在不进行任何实际分配的情况下消耗周期,直到找到要完成的请求。
注意:Linux 上的 C 使用 pthreads