2010-12-14 10 views
10

संदर्भ हैं (ucontext.h में कार्यों द्वारा छेड़छाड़ की गई वस्तुओं) को धागे में साझा करने की अनुमति है? यही है, क्या मैं swapcontext पर दूसरे तर्क के साथ makecontext में किसी अन्य थ्रेड पर बनाया गया संदर्भ हो सकता हूं? ऐसा लगता है कि एक परीक्षण कार्यक्रम यह लिनक्स पर काम कर रहा है। मुझे दस्तावेज एक तरफ या दूसरे पर नहीं मिल रहा है, जबकि विंडोज फाइबर स्पष्ट रूप से ऐसे उपयोग मामले का समर्थन करते हैं। क्या यह सामान्य रूप से करने के लिए सुरक्षित और ठीक है? क्या यह मानक पॉज़िक्स व्यवहार है कि यह काम करना चाहिए?धागे के पार ucontext

+1

क्या आप यहां अपना टेस्ट प्रोग्राम भी पोस्ट कर सकते हैं? – vpit3833

उत्तर

0

man page

एक सिस्टम वी की तरह वातावरण में से, एक प्रकार ucontext_t में परिभाषित किया गया और चार कार्य getcontext (2), setcontext (2), makecontext() है और swapcontext() कि किसी प्रक्रिया के भीतर नियंत्रण के एकाधिक थ्रेड के बीच उपयोगकर्ता स्तर के संदर्भ स्विचिंग को अनुमति देता है।

ऐसा लगता है कि यह क्या है।

संपादित करें: हालांकि this discussion इंगित करता है कि आपको उन्हें मिश्रण नहीं करना चाहिए।

+2

नहीं। यह "नियंत्रण के धागे" के बारे में बताता है, थ्रेड जो सहेजे गए हैं और * संदर्भ() द्वारा बहाल किए गए हैं। यह * संदर्भ() कार्यों और pthreads मिश्रण के बारे में कुछ भी नहीं कहता है। – osgx

+0

क्या [सोलारिस] (http://groups.google.com/group/comp.programming.threads/browse_thread/thread/c29c8a84e16fdba9) चर्चा सहायक है? पृथ्वी पर क्यों आप ऐसा करना चाहते हैं? थ्रेडिंग फिसलन पर्याप्त है क्योंकि यह थ्रेड परिभाषाओं को मिश्रित किए बिना है। – spraff

+0

यह मेरे लिए नहीं है। मूल धागे सादा सी के लिए पर्याप्त हो सकते हैं, लेकिन 1 के लिए पर्याप्त नहीं है) coroutines, उदा। गो में, आदि 2) हरी धागे के साथ भाषाएं, उदा। रूबी/पायथन – osgx

6

वास्तव में, लिनक्स के लिए एक एनजीपीटी - थ्रेडिंग लाइब्रेरी थी, जो मौजूदा 1: 1 थ्रेडिंग मॉडल (प्रत्येक उपयोगकर्ता थ्रेड कर्नेल थ्रेड या एलडब्ल्यूपी) का उपयोग नहीं करता है, लेकिन एम: एन थ्रेडिंग मॉडल (कई उपयोगकर्ता थ्रेड्स मेल खाते हैं) दूसरे के लिए, कर्नेल धागे की छोटी संख्या)।

ftp://ftp.uni-duisburg.de/Linux/NGPT/ngpt-0.9.4.tar.gz/ngpt-0.9.4/pth_sched.c:170 pth_scheduler के अनुसार यह देशी (गिरी) धागे के बीच उपयोगकर्ता धागा संदर्भों हिलाने की संभव था:

 /* 
     * See if the thread is unbound... 
     * Break out and schedule if so... 
     */ 
     if (current->boundnative == 0) 
      break; 
     /* 
     * See if the thread is bound to a different native thread... 
     * Break out and schedule if not... 
     */ 
     if (current->boundnative == this_sched->lastrannative) 
      break; 

बचाने के लिए और उपयोगकर्ता धागे को बहाल करने के लिए, ucontext ftp://ftp.uni-duisburg.de/Linux/NGPT/ngpt-0.9.4.tar.gz/ngpt-0.9.4/pth_mctx.c:64 इस्तेमाल किया जा सकता है और लगता है यह था एक पसंदीदा तरीका (mcsc):

/* 
* save the current machine context 
*/ 
#if PTH_MCTX_MTH(mcsc) 
#define pth_mctx_save(mctx) \ 
     ((mctx)->error = errno, \ 
      getcontext(&(mctx)->uc)) 
#elif 
.... 
/* 
* restore the current machine context 
* (at the location of the old context) 
*/ 
#if PTH_MCTX_MTH(mcsc) 
#define pth_mctx_restore(mctx) \ 
     (errno = (mctx)->error, \ 
      (void)setcontext(&(mctx)->uc)) 
#elif PTH_MCTX_MTH(sjlj) 
... 

#if PTH_MCTX_MTH(mcsc) 

/* 
* VARIANT 1: THE STANDARDIZED SVR4/SUSv2 APPROACH 
* 
* This is the preferred variant, because it uses the standardized 
* SVR4/SUSv2 makecontext(2) and friends which is a facility intended 
* for user-space context switching. The thread creation therefore is 
* straight-foreward. 
*/ 

तो, भले ही NGPT मर चुका है और अप्रयुक्त है, तो यह और भी गिरी धागे के बीच उपयोगकर्ता धागे स्विच करने के लिए चयनित * संदर्भ()। मुझे लगता है कि * संदर्भ() परिवार का उपयोग लिनक्स पर पर्याप्त सुरक्षित है।

ucontexts और अन्य मूल धागे पुस्तकालय मिश्रण करते समय कुछ समस्याएं हो सकती हैं। मैं एक एनपीटीएल पर विचार करूंगा, जो glibc 2.4 के बाद मानक लिनक्स देशी थ्रेडिंग लाइब्रेरी है। मुख्य समस्या THREAD_SELF है - वर्तमान धागे के struct pthread पर पॉइंटर। टीएलएस (थ्रेड-लोकल स्टोरेज) THREAD_SELF के माध्यम से भी काम करता है। THREAD_SELF आमतौर पर पंजीकरण पर संग्रहीत होता है (r2 on powerpc, %gs x86, आदि पर)। get/setcontext देशी pthread लाइब्रेरी (जैसे थ्रेड-स्थानीय स्टोरेज, थ्रेड पहचान इत्यादि) के इस रजिस्टर को तोड़ने वाले आंतरिक को सहेज और पुनर्स्थापित कर सकता है।

glibc will not save/restore %gs register setcontext pthreads के साथ संगत होना करने के लिए:

/* Restore the FS segment register. We don't touch the GS register 
     since it is used for threads. */ 
    movl oFS(%eax), %ecx 
    movw %cx, %fs 

आप की जाँच करनी चाहिए, setcontext वास्तुकला आप में रुचि रखते हैं पर रजिस्टर THREAD_SELF बचाता है इसके अलावा, अपने कोड OSes और libc के बीच पोर्टेबल नहीं हो सकता। रों।

+0

पूरी तरह से संतोषजनक नहीं है, लेकिन मुझे लगता है कि यह आपके पास सबसे अच्छी जानकारी है। धन्यवाद। – Flavio

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