Konvensi Penamaan untuk objek Penguncian Thread Khusus [ditutup]

16

Sebuah pertanyaan yang relatif kecil, tetapi saya belum dapat menemukan dokumentasi resmi atau bahkan pendapat / diskusi blog tentang itu.

Sederhananya: ketika saya memiliki objek pribadi yang tujuan utamanya adalah melayani untuk pribadi lock, apa yang saya beri nama objek itu?

class MyClass
{
    private object LockingObject = new object();

    void DoSomething()
    {
        lock(LockingObject)
        {
            //do something
        }
    }
}

Apa yang harus kita beri nama di LockingObjectsini? Juga pertimbangkan bukan hanya nama variabel tetapi bagaimana tampilannya dalam kode ketika mengunci.

Saya telah melihat berbagai contoh, tetapi tampaknya tidak ada saran masuk yang solid:

  1. Banyak penggunaan SyncRoot(dan variasi seperti _syncRoot).

    • Contoh kode: lock(SyncRoot) ,lock(_syncRoot)
    • Ini tampaknya dipengaruhi oleh SyncLockpernyataan VB yang setara , SyncRootproperti yang ada pada beberapa kelas ICollection dan bagian dari semacam pola desain SyncRoot (yang bisa dibilang adalah ide yang buruk)
    • Berada dalam konteks C #, tidak yakin apakah saya ingin memiliki penamaan VBish. Lebih buruk lagi, dalam VB penamaan variabel sama dengan kata kunci. Tidak yakin apakah ini akan menjadi sumber kebingungan atau tidak.
  2. thisLockdan lockThisdari artikel MSDN: Pernyataan kunci C # , Pernyataan VB SyncLock

    • Contoh kode: lock(thisLock) ,lock(lockThis)
    • Tidak yakin apakah ini diberi nama minimal murni untuk contoh atau tidak
    • Agak aneh jika kita menggunakan ini dalam statickelas / metode.
    • EDIT: Artikel Wikipedia tentang kunci juga menggunakan penamaan ini sebagai contohnya
  3. Beberapa penggunaan PadLock(dari berbagai casing)

    • Contoh kode: lock(PadLock) ,lock(padlock)
    • Tidak buruk, tetapi satu-satunya daging sapi saya adalah itu secara tidak mengejutkan memunculkan gambar "gembok" fisik yang saya cenderung tidak kaitkan dengan konsep threading abstrak .
  4. Memberi nama kunci berdasarkan apa yang ingin dikunci

    • Contoh kode: lock(messagesLock) , lock(DictionaryLock),lock(commandQueueLock)
    • Dalam contoh halaman VB SyncRoot MSDN, ia memiliki simpleMessageListcontoh dengan messagesLockobjek pribadi
    • Saya tidak berpikir itu ide yang baik untuk memberi nama kunci terhadap jenis yang Anda kunci ("DictionaryLock") karena itu adalah detail implementasi yang dapat berubah. Saya lebih suka memberi nama di sekitar konsep / objek yang Anda kunci ("messagesLock" atau "commandQueueLock")
    • Menariknya, saya sangat jarang melihat konvensi penamaan ini untuk mengunci objek dalam sampel kode online atau di StackOverflow.
  5. (EDIT) Spesifikasi C # di bawah bagian "8.12 Pernyataan Kunci" memiliki contoh pola ini dan menamainya synchronizationObject

    • Contoh kode: lock(SynchronizationObject) ,lock(synchronizationObject)

Pertanyaan: Apa pendapat Anda secara umum tentang penamaan swasta obyek penguncian?

Baru-baru ini, saya mulai menamai mereka ThreadLock(jadi agak suka opsi 3), tetapi saya mendapati diri saya mempertanyakan nama itu.

Saya sering menggunakan pola penguncian ini (dalam contoh kode yang disediakan di atas) di seluruh aplikasi saya, jadi saya pikir mungkin masuk akal untuk mendapatkan pendapat / diskusi yang lebih profesional tentang konvensi penamaan yang solid untuk mereka. Terima kasih!

Chris Sinclair
sumber

Jawaban:

4

Saya sudah terbiasa menyebutnya di SomeResourceLockmana SomeResourcekunci yang perlu Anda akses / perbarui, yaitu (maafkan semua masalah utas, ini hanya ilustrasi)

public class ProcessDataInQueue
{
    private static Queue<Data> _dataQueue = new Queue<Data>();
    private static object _dataQueueLock = new Object();

    public void AddOneItem(Data itemToAdd)
    {
        lock(_dataQueueLock)
        {
            _dataQueue.Enqueue(itemToAdd);
        }
    }

    public void ProcessOneItem()
    {
        Data itemToProcess = null;
        lock(_dataQueueLock)
        {
            itemToProcess = _dataQueue.Dequeue();
        }
        // ... process itemToProcess
    }
}

Saya mendapatkan kebiasaan ini setelah mengikuti kelas di mana saya dapat memiliki beberapa kunci untuk sumber daya yang berbeda, jadi saya memberi nama objek penguncian berdasarkan sumber daya apa yang dikunci untuk mengaksesnya. Kadang-kadang satu objek mungkin mengunci banyak sumber daya dalam hal ini saya akan mencoba membuat nama-nama itu menghormati bahwa dalam beberapa cara, sehingga pembaca tahu "kunci lain untuk sumber daya individu tersebut akan bersaing dengan kunci ini juga".

Jimmy Hoffa
sumber
2
Saya pikir ini membingungkan, karena SynchronizationContextada sesuatu yang sangat berbeda.
svick
1
@ svick Sangat mungkin saya menyalahgunakan istilah ini, saya masih berpikir bahwa spesifik tentang sumber daya yang dikunci itu penting, tetapi jika lebih masuk akal, saya akan mengedit ini untuk menyarankan kata "Kunci" di tempat "SynchronizationContext".
Jimmy Hoffa
6

Saya biasanya menyebutnya locker, tetapi karena ini bersifat pribadi, saya percaya itu adalah detail implementasi yang agak tidak penting. Aturan praktis pertama, gunakan standar tim / perusahaan Anda. Jika tidak ada satu, yah, tolong buat dan gunakan, tapi untuk membuatnya, sederhanakan. Jika kelas Anda memiliki objek penguncian tunggal, memanggilnya foocukup baik. Jika Anda memiliki banyak, urutan bisnis yang baik mungkin hanya meninjau kembali desain kelas itu terlebih dahulu untuk melihat apakah itu melakukan terlalu banyak hal yang berbeda. Tetapi, jika tidak, maka namanya menjadi penting, seperti dalam contoh yang benar-benar dibuat-buat ini:

public sealed class CustomerOrders
{
    private readonly object customerLocker = new object();

    private readonly object orderLocker = new object();

    public IEnumerable<Customer> Customers
    {
        get
        {
            lock (this.cutomerLocker)
            lock (this.orderLocker)
            {
                // stuff...
            }
        }

        set
        {
            lock (this.cutomerLocker)
            lock (this.orderLocker)
            {
                // other stuff...
            }
        }
    }

    public IEnumerable<Order> Orders
    {
        get
        {
            lock (this.orderLocker)
            {
                // stuff...
            }
        }

        set
        {
            lock (this.cutomerLocker)
            {
                // different stuff...
            }
        }
    }
}
Jesse C. Slicer
sumber
2
Saya sangat setuju dengan gaya penamaan yang kurang lebih seperti ini untuk beberapa mekanisme penguncian. Saya juga punya sesuatu yang sangat mirip dengan gaya ini ketika saya menerapkan kelas dengan dua loker (juga dire-refoured nanti)
Chris Sinclair
2

Saya selalu menggunakan lck_. Dengan begitu jika Anda ctrl + f 'lck' maka Anda hanya akan menemukan kunci sementara 'kunci' juga akan menemukan hal-hal seperti 'jam'.

Hal-hal seperti lockThis dan Gembok baik-baik saja untuk portofolio uni tetapi untuk proyek yang tepat Anda harus benar-benar menggunakan nama semantik sehingga ketika Anda melihat deklarasi Anda tahu apa objek sebenarnya tanpa mencari melalui kode.

Llama terbalik
sumber
Saya tidak tertarik pada bentuk nama pendek. Di satu sisi masuk akal untuk memiliki gaya penamaan (ish) yang unik untuk menemukan semua penggunaan. Di sisi lain, dan mungkin aku beruntung, aku tidak perlu menemukan kunci; Saya membayangkan jika saya harus mencari "kunci (" akan memberi saya hasil yang cukup baik dengan beberapa kesalahan positif yang cukup mudah untuk diabaikan.
Chris Sinclair