2012-01-25 11 views
7

pthread_key_t ve pthread_key_create öğelerinin nasıl çalıştığını anlamaya çalışırken sorun yaşıyorum. Anladığım kadarıyla, her bir iş parçacığı TLS (iş parçacığı yerel depolama alanı) ve iş parçacığı yerel depolama alanına erişmek için bir anahtarın kullanılmasını sağlar. Ne elde edemiyorum bir anahtar oluşturulduğunda, her iş parçacığı kullanmak için olsun? Konu 0 iş parçacığı 0 oluşturur, iş parçacığı 1'i sonra 0 tuşunu kullanabilir mi? Eğer iş parçacığı 1 anahtar 0 kullanıyorsa, kendi TLS veya iş parçacığı 0'ın TLS'sine erişir mi?pthread_key_t ve pthread_key_create yöntemi nasıl çalışır?

Kullanılmakta olan tüm anahtarları izleyen bazı genel dizi veya bir şey var mı?

cevap

5

pthread_keys, söylediğiniz şeydir, ortak bir anahtar tarafından belirtilen yerel depolama iş parçacığı. Böylece birden fazla iş parçacığı aynı anahtarı kullanır, ancak farklı depolama alanı (iş parçacığı başına) alır.

Hızlı bir örnek (çok fazla da olsa), eşzamansız bir sunucu (IMAP gibi) oluşturduğunuzu varsayalım. İstemci bağlantılarını bir dizide takip edebilir, her biri geçerli görev/istek için bir anahtara sahip olur. Böylece, yeni bir iş parçacığında bir istek geldiğinde ve iş parçacığı, Client_Connection-> WhatAmIDoing anahtarında "istek" yapısının işaretçisini saklar. Artık iş parçacığının, pthread_getspecific() işlevini çağırabildiği ve işaretçiyi ne yapması gerektiğine yönlendirebileceği için, iş parçacığı bu işaretçinin etrafında geçmek zorunda kalmazdı.

+1

pthread_key_create için kaynak koduna bakarak, pthread_key_t içinde TlsAlloc formuna döndürülen her ne olursa olsun, anahtar olarak adlandırılan bir değişken ayarlar. Anahtar bir işaretçidir ancak TlsAlloc'tan ne döndürülür? her iş parçacığı için sadece bir dizi boş yuva mı? Ayrıca, her bir iş parçacığının kendi Tls alanı varsa, dizideki her öğe yalnızca Tls boşluğunu işaret eder mi? Sadece bir yerlerde kafam karıştı ve nerede olduğunu bilmiyorum. Belki de bunu olması gerekenden daha karmaşık yapıyorum. – user972276

+2

Teknik olarak evet, pthread_key, _create işlevini çağırdığınızda oluşturulan seyrek bir dizinin yalnızca bir göstericisidir. Bir iş parçacığı _setspecific() işlevini çağırdığında, dizideki bir girdide iş parçacığının kimliğini ve işlev tarafından saklanan değeri (örneğimde bir yapının işaretçisi) doldurur. Bir iş parçacığı _getspecific() işlevini çağırdığında, diziyi anahtar tarafından arar, ardından bu dizideki girdiyi, iş parçacığı kimliği tarafından depolanan değeri bulmak için arar. –

+1

Bu arabirimlerin noktasını, sahne arkasında neler olup bittiğini özetlersek, programınızın platform/uygulamaya bağlı olmadığını unutmayın. –

İlgili konular