我有一个共享内存池,许多不同的线程可以请求分配。从这个请求分配将在每个线程中发生LOT,但是线程数量可能很小,通常只有一个线程在运行。我不确定以下哪种处理方式更好。更好地锁定共享资源,或有一个线程来满足请求?
最终,我可能需要实现两者,看看哪一个会产生更有利的结果......我还担心,即使考虑#2可能是过早优化,因为我实际上没有使用此共享的代码资源尚未写入。但是这个问题非常有趣,它会让我从其他工作中分心。
1)创建一个互斥锁,让一个线程尝试在获取分配之前锁定它,然后解锁它。
2)让每个线程注册一个请求插槽,当它需要分配时,它将请求放入插槽,然后等待请求插槽的块(while(result == NULL){usleep()})结果。单线程不断迭代请求时隙,进行分配并将其分配给请求时隙中的结果。
数字1是简单的解决方案,但如果时机正确,单个线程可能会锁定锁定。第二个更复杂,但确保从资源拉出时线程之间的公平性。但是它仍然会阻塞请求的线程,并且如果有多个线程,则迭代可能会在不发生任何实际分配的情况下刻录循环,直到找到请求来完成。
注意:在Linux上使用pthreads的C
在您的解决方案#2中,您如何确保原子访问结果? 'usleep()'(它接受一个参数,BTW)的手册页说它暂停了调用*进程*。 –
手册页错误;它只是由不知道或苦恼的人写出来的。 'usleep'的正确文档在这里:http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html –
@R ..旧的Linux手册页(如linux.die)有错误办法。 – cnicutar