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:
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.
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 destatic
extern
), yerel statik nesneleri ve sınıfların statik veri üyelerini içerir. özniteliğiylethread
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)
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin