2017-02-17 13 views
9

निम्न में से प्रत्येक थ्रेड-स्थानीय स्टोरेज कार्यान्वयन के लिए, कंपाइलर या मानक लाइब्रेरी द्वारा प्रकट मानक एफएफआई तंत्र का उपयोग करके जंग के कार्यक्रमों में बाहरी थ्रेड-स्थानीय चर का उपयोग कैसे किया जा सकता है?जंगली धागे-स्थानीय वैश्विक चर जंग में कैसे पहुंचे हैं?

  • C11
  • जीसीसी के TLS एक्सटेंशन
  • pthreads
  • विंडोज टीएलएस एपीआई
+2

क्या आप लाइब्रेरी को पूरक बना सकते हैं और उन थ्रेड_लोकल चरों को पढ़ने और लिखने के लिए सी फ़ंक्शन प्रदान कर सकते हैं? – kennytm

+0

हां। जंगली-स्थानीय चर से निपटने के लिए एक छोटी गोंद लाइब्रेरी लिखना मेरा इरादा है यदि जंग को ऐसा करने की आवश्यक सुविधाएं नहीं हैं। हालांकि, यदि संभव हो तो मैं अतिरिक्त निर्माण निर्भरताओं से बचना पसंद करता हूं। – Doe

+2

किसी भी उत्तर के लिए आपको हमें बताने की आवश्यकता होगी ** आप किस थ्रेडिंग सिस्टम का उपयोग कर रहे हैं और आप थ्रेड स्थानीय चर कैसे बना रहे हैं **। ऐसा करने का एक शानदार तरीका बाहरी कोड का एक [एमसीवीई] और आपके द्वारा बनाए गए जंग कोड प्रदान करना होगा जो दिखाता है कि आप इसे कैसे एक्सेस करना चाहते हैं। – Shepmaster

उत्तर

6

जंग एक रात सुविधा है, जो बाहरी धागा स्थानीय चर को जोड़ने की अनुमति देता है है। सुविधा का स्थिरीकरण here ट्रैक किया गया है।

C11/जीसीसी TLS एक्सटेंशन

C11 _Thread_local कीवर्ड एक वस्तु के लिए thread-storage duration परिभाषित करने के लिए परिभाषित करता है। thread_local मैक्रो उपनाम भी मौजूद है।

जीसीसी एक Thread Local एक्सटेंशन लागू करता है जो एक कीवर्ड के रूप में __thread का उपयोग करता है।

दोनों एक बाहरी C11 _Thread_local और एक जीसीसी __thread चर रात का उपयोग कर संभव है से लिंक करना

#![feature(thread_local)] 

extern crate libc; 

use libc::c_int; 

#[link(name="test", kind="static")] 
extern { 
    #[thread_local] 
    static mut test_global: c_int; 
} 

fn main() { 
    let mut threads = vec![]; 
    for _ in 0..5 { 
     let thread = std::thread::spawn(|| { 
      unsafe { 
       test_global += 1; 
       println!("{}", test_global); 
       test_global += 1; 
      } 
     }); 
     threads.push(thread); 
    } 

    for thread in threads { 
     thread.join().unwrap(); 
    } 
} 

यह एक चर निम्नलिखित में से किसी के रूप में घोषित करने के लिए पहुँच प्राप्त की अनुमति देता है (rustc 1.17.0-nightly (0e7727795 2017-02-19) और जीसीसी 5.4 के साथ परीक्षण):

_Thread_local extern int test_global; 
extern __local int test_global; 

ऊपर जंग कोड के उत्पादन में हो जाएगा:

1 
1 
1 
1 
1 

जो अपेक्षा की जाती है, जब चर को थ्रेड स्थानीय के रूप में परिभाषित किया जाता है।

+0

उत्कृष्ट जवाब। प्रतीत होता है कि ट्रैकिंग ट्रैकिंग समस्या https://github.com/rust-lang/rust/issues/29594 प्रतीत होती है। इस मुद्दे से ऐसा लगता है कि स्थिरीकरण की संभावना प्रतीत नहीं होती है। – Doe

संबंधित मुद्दे