Aracılığıyla paylaş


thread

Microsoft'a Özgü

Genişletilmiş thread depolama sınıfı değiştirici, iş parçacığı yerel değişkenini bildirmek için kullanılır. C++11 ve sonraki sürümlerde taşınabilir eşdeğer için, taşınabilir kod için thread_local depolama sınıfı tanımlayıcısını kullanın. Windows thread_local üzerinde ile __declspec(thread)uygulanır.

Sözdizimi

__declspec(thread)Bildiricisi

Açıklamalar

İş Parçacığı Yerel Depolaması (TLS), çok iş parçacıklı bir işlemdeki her iş parçacığının, iş parçacığına özgü veriler için depolama alanı ayırdığı mekanizmadır. Standart çok iş parçacıklı programlarda veriler belirli bir işlemin tüm iş parçacıkları arasında paylaşılırken, iş parçacığı yerel depolaması, her iş parçacığı verisi için ayrıma yapan mekanizmadır. İş parçacıklarının tam bir tartışması için bkz . Çoklu iş parçacığı kullanımı.

İş parçacığı yerel değişkenlerinin bildirimleri, genişletilmiş öznitelik söz dizimini __declspec ve anahtar sözcüğünü anahtar sözcükle birlikte thread kullanmalıdır. Örneğin, aşağıdaki kod bir tamsayı iş parçacığı yerel değişkenini bildirir ve bunu bir değerle başlatır:

__declspec( thread ) int tls_i = 1;

Dinamik olarak yüklenen kitaplıklarda iş parçacığı yerel değişkenlerini kullanırken, iş parçacığı yerel değişkeninin doğru başlatılmamasına neden olabilecek faktörleri bilmeniz gerekir:

  1. Değişken bir işlev çağrısıyla (oluşturucular dahil) başlatılırsa, bu işlev yalnızca ikili/DLL dosyasının işleme yüklenmesine neden olan iş parçacığı için ve ikili/DLL yüklendikten sonra başlayan iş parçacıkları için çağrılır. BAŞLATMA işlevleri, DLL yüklendiğinde zaten çalışmakta olan başka bir iş parçacığı için çağrılmaz. Dinamik başlatma, DLL_THREAD_ATTACH için DllMain çağrısında gerçekleşir, ancak dll iş parçacığı başlatıldığında işlemde değilse DLL hiçbir zaman bu iletiyi almaz.

  2. Sabit değerlerle statik olarak başlatılan iş parçacığı yerel değişkenleri genellikle tüm iş parçacıklarında düzgün bir şekilde başlatılır. Ancak Aralık 2017'den itibaren Microsoft C++ derleyicisinde constexpr değişkenlerin statik başlatma yerine dinamik aldığı bilinen bir uyumluluk sorunu vardır.

    Not: Bu sorunların ikisinin de derleyicinin gelecekteki güncelleştirmelerinde düzeltilmesi beklenir.

Ayrıca, iş parçacığı yerel nesneleri ve değişkenlerini bildirirken bu yönergeleri gözlemlemeniz gerekir:

  • Özniteliği yalnızca sınıfa ve veri bildirimlerine ve tanımlarına uygulayabilirsiniz thread ; thread işlev bildirimleri veya tanımlarında kullanılamaz.

  • Özniteliği yalnızca statik depolama süresi olan veri öğelerinde belirtebilirsiniz thread . Bu, genel veri nesnelerini (hem hem de static extern), yerel statik nesneleri ve sınıfların statik veri üyelerini içerir. özniteliğiyle thread otomatik veri nesneleri bildiremezsiniz.

  • Bildirimin ve tanımın thread aynı dosyada mı yoksa ayrı dosyalarda mı yer alması fark etmeksizin bildirimi ve iş parçacığı yerel nesnesinin tanımı için özniteliğini kullanmanız gerekir.

  • özniteliğini thread tür değiştirici olarak kullanamazsınız.

  • özniteliğini kullanan nesnelerin bildirimine izin verildiğinden thread , bu iki örnek anlamsal olarak eşdeğerdir:

    // declspec_thread_2.cpp
    // compile with: /LD
    __declspec( thread ) class B {
    public:
       int data;
    } BObject;   // BObject declared thread local.
    
    class B2 {
    public:
       int data;
    };
    __declspec( thread ) B2 BObject2;   // BObject2 declared thread local.
    
  • Standart C, yalnızca statik olmayan nesneler için, kendisine başvuru içeren bir ifadeyle bir nesnenin veya değişkenin başlatılmasına izin verir. C++ normalde kendisine başvuru içeren bir ifade içeren bir nesnenin dinamik olarak başlatılmasına izin verse de, iş parçacığı yerel nesnelerinde bu tür bir başlatmaya izin verilmez. Örneğin:

    // declspec_thread_3.cpp
    // compile with: /LD
    #define Thread __declspec( thread )
    int j = j;   // Okay in C++; C error
    Thread int tls_i = sizeof( tls_i );   // Okay in C and C++
    

    sizeof Başlatılan nesneyi içeren bir ifade kendisine başvuru oluşturmaz ve C ve C++'da izin verilir.

END Microsoft'a Özgü

Ayrıca bkz.

__declspec
Anahtar Sözcükler
İş Parçacığında Yerel Depolama (TLS)