Kendim biraz karıştığım için, sorudaki birkaç kavramı açıklığa kavuşturuyorum.
Koleksiyonu . Genel olarak veri yapıları için ne olduğunu sorabildiğimizde, "koleksiyon" un ne anlama geldiğini tanımlamak için zaman harcamak için hiçbir neden göremiyorum. Bir veri yapısı bir bellek alanını kaplar ve bu belleğe erişebilen ve kullanıcılar tarafından çağrılabilecek bazı işlemleri vardır . Bu kullanıcılar farklı işlemciler veya sadece farklı iş parçacıkları olabilir, bizi ilgilendirmez. Önemli olan tek şey işlemleri paralel olarak yürütebilmeleridir.
Kilitsiz . Herlihy ve Boss , kilitlenen bir kullanıcı veri yapısının daha fazla kullanılmasını engellemediğinde bir veri yapısının kilitsiz olduğunu söyler. Örneğin, sıralı bir kümeye bir düğüm eklemenin ortasında bulunan bir işlemciye su döktüğünü düşünün. Diğer işlemciler daha sonra bu sıralı kümeye eklemeyi denerse başarılı olurlar. ( Düzenleme: Bu tanımlamaya göre, bir veri yapısı kullanır kilitler o zaman kilit serbest değilse bu durumda, ama öyle değil , bir veri yapısı kilitlerini kullanmıyorsa o zaman kilidi serbest olduğunu olgusu.)
Bu tanım ile, Herlihy ve Boss'un temelde cevabın kritik bölgeleri işlemlere dönüştürmek olduğunu söylüyorum.
Ancak, bunun aynı karmaşıklığa sahip olduğunu sorabilirsiniz. Sorunun mantıklı olduğundan emin değilim. Düşünün push(x) { lock(); stack[size++] = x; unlock(); }
. Bu sabit bir zaman operasyonu mu? Kilitleme işlemini ve dolayısıyla diğer kullanıcıları yoksayarsanız, YES (Evet) yanıtı verebilirsiniz. Eğer diğer kullanıcıları göz ardı etmek istemiyorsanız, o zaman orada gerçekten olup olmadığını söylemek için bir yol yoktur itme sabit zamanda çalışacaktır. Eğer bir düzey yukarı gidip yığını bazı belirli algoritma ile nasıl kullanıldığını görürseniz, o zaman söylemek mümkün olabilir itme her zaman (sizin paralel algoritmanın girdi ne olursa olsun, anlamında artık ölçülen) sabit zaman alacaktır. O söylemek mantıklı değil Fakat bunu gerçekten senin algoritmasının bir özelliktir itme olan sabit zaman çalışma.
Özetle, bir işlemi yürüten bir kullanıcının diğer kullanıcılar için ne kadar beklediğini görmezden gelirseniz, kritik bölgeler yerine işlemleri kullanmak sorunuzu olumlu yanıtlar. Bekleme süresini yoksayarsanız, veri yapısının nasıl kullanıldığına bakmanız gerekir.