हालिया GCC, उदा। GCC 5 सी 11 और उसके thread_local
का समर्थन करते हैं (उदाहरण के साथ gcc -std=c11
के साथ संकलित)। FUZxxl टिप्पणी के रूप में, आप उपयोग कर सकते हैं (C11 thread_local
के बजाय) __thread
पुराने जीसीसी संस्करणों द्वारा समर्थित क्वालीफायर। Thread Local Storage के बारे में पढ़ें।
pthread_getspecific
वास्तव में बहुत धीमी गति से (यह POSIX पुस्तकालय में है, इसलिए जीसीसी द्वारा लेकिन GNU glibc या musl-libc द्वारा उदा प्रदान नहीं की है) के बाद से यह एक समारोह कॉल किया जाता है। thread_local
चर का उपयोग करना शायद तेज़ होगा।
कार्यान्वयन के उदाहरण के लिए MUSL's thread/pthread_getspecific.c
file के स्रोत कोड में देखें। संबंधित प्रश्न पर this answer पढ़ें।
और _thread
& thread_local
(अक्सर) pthread_getspecific
पर जादुई रूप से अनुवाद करने के लिए अनुवादित नहीं हैं। वे आमतौर पर कुछ विशिष्ट पता मोड और/या रजिस्टर (विवरण ABI से संबंधित कार्यान्वयन विशिष्ट हैं; लिनक्स पर, मुझे लगता है कि चूंकि x86-64 में अधिक रजिस्ट्रार & पता मोड हैं, इसलिए टीएलएस का कार्यान्वयन i386 से तेज है), compiler, linker और runtime system से सहायता के साथ। इसके विपरीत यह हो सकता है कि pthread_getspecific
के कुछ कार्यान्वयन कुछ आंतरिक thread_local
चर (POSIX धागे के कार्यान्वयन में) का उपयोग कर रहे हैं।
उदाहरण के लिए, निम्न कोड
#include <pthread.h>
const extern pthread_key_t key;
__thread int data;
int
get_data (void) {
return data;
}
int
get_by_key (void) {
return *(int*) (pthread_getspecific (key));
}
जीसीसी 5 का उपयोग कर संकलन।
.type get_data, @function
get_data:
.LFB3:
.cfi_startproc
movl %gs:[email protected], %eax # data,
ret
.cfi_endproc
और एक स्पष्ट कॉल के साथ get_by_key
के निम्नलिखित कोडpthread_getspecific
लिए:
get_by_key:
.LFB4:
.cfi_startproc
subl $24, %esp #,
.cfi_def_cfa_offset 28
pushl key # key
.cfi_def_cfa_offset 32
call pthread_getspecifiC#
movl (%eax), %eax # MEM[(int *)_4], MEM[(int *)_4]
addl $28, %esp #,
.cfi_def_cfa_offset 4
ret
.cfi_endproc
इसलिए TLS का उपयोग 2 gcc -m32 -S -O2 -fverbose-asm
साथ (Debian/सिड पर) get_data
TLS का उपयोग करने के लिए निम्न कोड देता है __thread
(या thread_local
सी 11) के साथ शायद pthread_getspecific
का उपयोग कर (एक फोन की भूमि के ऊपर से परहेज) की तुलना में तेजी से किया जाना चाहिए।
ध्यान दें कि thread_local
एक convenience macro defined in <threads.h>
(एक C11 मानक शीर्षलेख) है।
'__thread' विभिन्न प्लेटफार्मों पर अलग ढंग से कार्यान्वित किया जाता है, कुछ पर (आप हमें नहीं बताया है जो आप के लिए प्रोग्रामिंग कर रहे हैं एक), यह' pthread_getspecific' साथ लागू किया जा सकता है। – fuz
कृपया हमें और जानकारी दें! मैं वास्तव में अपनी समस्या को हल करने के लिए लेकिन अभी मैं तुम्हें क्या मंच का उपयोग/कैसे आप अपने कोड कैसे धागा स्थानीय भंडारण बेहतर प्रदर्शन करने के लिए के रूप में आप एक जवाब देने के लिए सक्षम होने के लिए संकलन के बारे में पर्याप्त जानकारी नहीं है चाहते हैं। – fuz