dsi*_*cha 5 language-agnostic performance multithreading synchronization d
我有一个场景,在我的程序中的某些点,线程需要更新几个共享数据结构.每个数据结构都可以与任何其他数据结构并行安全地更新,但每个数据结构一次只能由一个线程更新.我在代码中表达的简单,天真的方式是:
synchronized updateStructure1();
synchronized updateStructure2();
// ...
Run Code Online (Sandbox Code Playgroud)
这似乎效率低下,因为如果多个线程正在尝试更新结构1,但没有线程尝试更新结构2,则它们都会阻塞等待保护结构1的锁,而结构2的锁则不会被取消.
是否有"标准"的方法来弥补这一点?换句话说,是否有一个标准的线程原语试图以循环方式更新所有结构,只有在采用所有锁定时才会阻塞,并在更新所有结构时返回?
这是一个与语言无关的问题,但如果有帮助,我使用的语言是D.
我不知道是否有标准方法可以做到这一点。但是,我会实现如下所示的内容:
do
{
if (!updatedA && mutexA.tryLock())
{
scope(exit) mutexA.unlock();
updateA();
updatedA = true;
}
if (!updatedB && mutexB.tryLock())
{
scope(exit) mutexB.unlock();
updateB();
updatedB = true;
}
}
while (!(updatedA && updatedB));
Run Code Online (Sandbox Code Playgroud)
一些聪明的元编程可能可以减少重复,但我将其作为练习留给您。