2011-01-05 4 views
19

मैं एंड्रॉइड एनडीके में सी ++ कोड के मध्य आकार के बॉडी को पोर्ट कर रहा हूं। दुर्भाग्य से pthreads कार्यान्वयन (एनडीके v5 के रूप में, वैसे भी) अपूर्ण है। विशेष रूप से, हमारा एप्लिकेशन कार्यकर्ता थ्रेड को मारने के लिए pthread_cancel() पर निर्भर करता है। एनडीके pthread_cancel() लागू नहीं करता है! अन्य स्पष्ट उत्तर हैं जब कार्यकर्ता धागा सामान्य रूप से प्रतिक्रिया दे रहा है। लेकिन ऐसे मामलों में जहां कार्यकर्ता थ्रेड प्रतिक्रिया नहीं दे रहा है (उदा। अनंत लूप), मैं पूरी प्रक्रिया को मारने के बिना इसे कैसे रद्द कर सकता हूं?pthread_cancel() विकल्प?

उत्तर

14

संभावित विकल्प है कि इस आदमी के लिए काम करता है: http://igourd.blogspot.com/2009/05/work-around-on-pthreadcancel-for.html

मामले में यहाँ पुनः पोस्टिंग:

तब मैं pthread_kill का प्रयोग कर एक SIG_USR1 संकेत को गति प्रदान और प्रयोग संकेत हैंडलर को यह pthread बाहर निकलने के लिए और इसे करने की कोशिश

, यह काम करता है, लेकिन फिर भी सोच रहा है कि इस तरह की विधि के लिए कमियां हैं या नहीं।

टाइमर बाहर:

if ((status = pthread_kill(pthread_id, SIGUSR1)) != 0) 
{ 
    printf("Error cancelling thread %d, error = %d (%s)", pthread_id, status, strerror status)); 
} 

USR1 हैंडलर:

struct sigaction actions; 
memset(&actions, 0, sizeof(actions)); 
sigemptyset(&actions.sa_mask); 
actions.sa_flags = 0; 
actions.sa_handler = thread_exit_handler; 
rc = sigaction(SIGUSR1,&actions,NULL); 
void thread_exit_handler(int sig) 
{ 
    printf("this signal is %d \n", sig); 
    pthread_exit(0); 
} 

लग रहा है सबसे अच्छा जवाब की तरह ताकि धागे आईओ पर प्रतीक्षा नहीं कर रहे पुनर्लेखन के लिए है: http://groups.google.com/group/android-platform/browse_thread/thread/0aad393da2da65b1

+0

कार्यकर्ता धागा प्रतीक्षा करता है ताकि धागा रद्द करने के लिए एक जांच जोड़ने के लिए स्पष्ट जगह है,

मैं इसे libbthread :)

का आनंद लें कहा जाता है। कुछ सीमित अवरोध I/O है लेकिन यह थ्रेड का उत्तरदायी कारण उत्तरदायी नहीं है। मैं थ्रेड शट डाउन के लिए संकेतों का उपयोग करने से बचने की उम्मीद कर रहा था क्योंकि इसके लिए प्रत्येक थ्रेड, आईएमई में हैकिंग सिग्मास्क की आवश्यकता होती है। –

+2

हां यह एक शर्म की बात है जो वर्तमान एंड्रॉइड एनडीके में नहीं है, कुछ परेशान कार्यों को जोड़ती है। बहु मंच विकास की खुशी। हमने अपनी थ्रेडिंग लाइब्रेरी को आसानी से पोर्ट किया है क्योंकि हमें pthread_cancel या semaphores का उपयोग करने की आवश्यकता नहीं है, लेकिन ऐसा लगता है कि कुछ प्रकार के पुनर्लेखन/इंटरफेस कार्यान्वयन को उस लापता होने के कारण बदलना होगा। –

+0

सिग्नल हैंडलर में 'pthread_exit() 'को कॉल करना मूल रूप से एसिंक्रोनस रद्दीकरण करता है (देखें' pthread_setcanceltype()')। यह सही तरीके से उपयोग करने के लिए खतरनाक और कठिन है। स्थगित रद्दीकरण सही ढंग से उपयोग करना आसान है क्योंकि यह केवल विशिष्ट रद्दीकरण बिंदुओं पर रद्द हो जाता है (हालांकि यह अभी भी काफी प्रयास है), लेकिन थ्रेडिंग लाइब्रेरी के लिए इसे कार्यान्वित करना भी कठिन है। – jilles

0

मैं एक छोटी पुस्तकालय बनाई जिसने इसका ख्याल रखा।

यह बायोनिक थ्रेड संरचना के कुछ अप्रयुक्त बिट्स का शोषण करता है। , जब यह इंतजार कर रहा है) बाहरी घटनाओं के लिए एक सेमाफोर पर

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