Aracılığıyla paylaş


One-Time Başlatma

Bileşenler genellikle ilk çağrıldıklarında, yüklendiklerinde değil, ilk çağrıldıklarında başlatma görevlerini gerçekleştirmek için tasarlanmıştır. Tek seferlik başlatma işlevleri, birden çok iş parçacığı başlatmayı denese bile bu başlatmanın yalnızca bir kez gerçekleşmesini sağlar.

Windows Server 2003 ve Windows XP: Uygulamaları, birbirine bağlı işlevleri veya diğer eşitleme mekanizmasını kullanarak bir kerelik başlatma için kendi eşitlemelerini sağlamalıdır. Tek seferlik başlatma işlevleri Windows Vista ve Windows Server 2008'den itibaren kullanılabilir.

Tek seferlik başlatma işlevleri, başlatmayı yalnızca bir iş parçacığının gerçekleştirmesini sağlamak için önemli avantajlar sağlar:

  • Hız için iyileştirilmiştir.
  • Bunlar, bunları gerektiren işlemci mimarilerinde uygun engelleri oluşturur.
  • Hem kilitli hem de paralel başlatmayı destekler.
  • Kodun zaman uyumsuz veya zaman uyumlu bir şekilde çalışabilmesi için iç kilitlemeden kaçınırlar.

Sistem, veri ve durum bilgilerini içeren opak bir INIT_ONCE yapısı aracılığıyla başlatma işlemini yönetir. Çağıran bu yapıyı ayırır ve InitOnceInitialize çağırarak (yapıyı dinamik olarak başlatmak için) veya yapı değişkenine sabit INIT_ONCE_STATIC_INIT atayarak (yapıyı statik olarak başlatmak için) başlatır. Başlangıçta, tek seferlik başlatma yapısında depolanan veriler NULL olur ve durumu başlatılmaz.

Tek seferlik başlatma yapıları işlemler arasında paylaşılamaz.

Başlatmayı gerçekleştiren iş parçacığı isteğe bağlı olarak başlatma tamamlandıktan sonra çağıranın kullanabileceği bir bağlam ayarlayabilir. Bağlam bir eşitleme nesnesi veya bir değer veya veri yapısı olabilir. Bağlam bir değerse, düşük sıralı INIT_ONCE_CTX_RESERVED_BITS sıfır olmalıdır. Bağlam bir veri yapısıysa, veri yapısı DWORD hizalanmış olmalıdır. Bağlam, InitOnceBeginInitialize veya initOnceExecuteOnceişlevininlpContext çıkış parametresinde çağırana döndürülür.

Tek seferlik başlatma zaman uyumlu veya zaman uyumsuz olarak gerçekleştirilebilir. İsteğe bağlı bir geri çağırma işlevi, zaman uyumlu tek seferlik başlatma için kullanılabilir.

Zaman Uyumlu Tek Seferlik Başlatma

Aşağıdaki adımlar, geri çağırma işlevi kullanmayan zaman uyumlu tek seferlik başlatmayı açıklar.

  1. InitOnceBeginInitialize işlevinin başarıyla çağrılan ilk iş parçacığı, tek seferlik başlatmanın başlamasına neden olur. Zaman uyumlu tek seferlik başlatma için InitOnceBeginInitializeINIT_ONCE_ASYNC bayrağı olmadan çağrılmalıdır.
  2. Başlatmayı deneyen sonraki iş parçacıkları, ilk iş parçacığı başlatma tamamlanana veya başarısız olana kadar engellenir. İlk iş parçacığı başarısız olursa, sonraki iş parçacığının başlatmayı denemesine izin verilir, vb.
  3. Başlatma tamamlandığında, iş parçacığı InitOnceComplete işlevini çağırır. İş parçacığı isteğe bağlı olarak bir eşitleme nesnesi (veya diğer bağlam verileri) oluşturabilir ve bunu InitOnceComplete işlevinin lpContext parametresinde belirtebilir.
  4. Başlatma başarılı olursa, tek seferlik başlatma yapısının durumu başlatılır ve lpContext tanıtıcısı (varsa) başlatma yapısında depolanır. Sonraki başlatma girişimleri bu bağlam verilerini döndürür. Başlatma başarısız olursa veriler NULL .

Aşağıdaki adımlarda, bir geri çağırma işlevi kullanan zaman uyumlu tek seferlik başlatma açıklanmaktadır.

  1. InitOnceExecuteOnce işlevini başarıyla çağıran ilk iş parçacığı, uygulama tanımlı bir InitOnceCallback geri çağırma işlevine ve geri çağırma işlevinin gerektirdiği tüm verilere bir işaretçi geçirir. Çağrı başarılı olursa InitOnceCallback geri çağırma işlevi yürütülür.
  2. Başlatmayı deneyen sonraki iş parçacıkları, ilk iş parçacığı başlatma tamamlanana veya başarısız olana kadar engellenir. İlk iş parçacığı başarısız olursa, sonraki iş parçacığının başlatmayı denemesine izin verilir, vb.
  3. Başlatma tamamlandığında geri çağırma işlevi döndürür. Geri çağırma işlevi isteğe bağlı olarak bir eşitleme nesnesi (veya diğer bağlam verileri) oluşturabilir ve bunu Context çıkış parametresinde belirtebilir.
  4. Başlatma başarılı olursa, tek seferlik başlatma yapısının durumu başlatılır ve Bağlam tutamacı (varsa) başlatma yapısında depolanır. Sonraki başlatma girişimleri bu bağlam verilerini döndürür. Başlatma başarısız olursa veriler NULL .

Zaman Uyumsuz Tek Seferlik Başlatma

Aşağıdaki adımlarda zaman uyumsuz tek seferlik başlatma açıklanmaktadır.

  1. Birden çok iş parçacığı aynı anda INIT_ONCE_ASYNCile InitOnceBeginInitialize çağırarak başlatmayı denerse, fPending parametresi TRUE olarak ayarlanmış tüm iş parçacıklarında işlev başarılı olur. Başlatma sırasında yalnızca bir iş parçacığı başarılı olur; diğer eşzamanlı girişimler başlatma durumunu değiştirmez.
  2. InitOnceBeginInitializedöndürdüğünde, fPending parametresi başlatma durumunu gösterir:
    • fPending FALSE ise, bir iş parçacığı başlatmayı başarmıştır. Diğer iş parçacıkları, oluşturdukları bağlam verilerini temizlemeli ve InitOnceBeginInitializelpContext çıkış parametresinde bağlam verilerini kullanmalıdır.
    • fPending TRUE ise başlatma henüz tamamlanmamıştır ve diğer iş parçacıkları devam etmelidir.
  3. Her iş parçacığı InitOnceComplete işlevini çağırır. İş parçacığı isteğe bağlı olarak bir eşitleme nesnesi (veya diğer bağlam verileri) oluşturabilir ve bunu InitOnceCompletelpContext parametresinde belirtebilir.
  4. initOnceCompletedöndürdüğünde, dönüş değeri çağrılan iş parçacığının başlatma sırasında başarılı olup olmadığını gösterir.
    • InitOnceComplete başarılı olursa, çağıran iş parçacığı başlatmada başarılı olur. Tek seferlik başlatma yapısının durumu başlatılmış olarak değiştirilir ve lpContext tanıtıcısı (varsa) başlatma yapısında depolanır.
    • InitOnceComplete başarısız olursa, başka bir iş parçacığı başlatmayı başarmıştır. Çağıran iş parçacığı, oluşturduğu bağlam verilerini temizlemeli ve InitOnceBeginInitialize tek seferlik başlatma yapısında depolanan bağlam verilerini almak için INIT_ONCE_CHECK_ONLY ile çağırmalıdır.

Birden çok siteden çağrı One-Time Başlatma

Tek bir INIT_ONCE yapısı tarafından korunan tek seferlik başlatma birden çok siteden gerçekleştirilebilir; her siteden farklı geri çağırma geçirilebilir ve geri çağırma ile ve geri çağırma olmadan eşitleme karıştırılabilir. Başlatma işleminin yalnızca bir kez başarılı bir şekilde gerçekleştirilmesi garanti edilir.

Ancak, zaman uyumsuz ve zaman uyumlu başlatma karıştırılamaz: zaman uyumsuz başlatma denendikten sonra, zaman uyumlu başlatma başlatma girişimleri başarısız olur.

One-Time Başlatma Kullanarak