2010-07-08 21 views
6

मैं अलग प्राथमिकताओं होने धागे का एक पूल का प्रबंधन करने की जरूरत है, तो मैं निम्नलिखित धागा स्टार्टअप प्रक्रिया लिखा है: उच्च प्राथमिकता वाले धागे को चलाने के सुरक्षा प्रभावों के कारण pthread_create() कॉल को EPERM वापस करना चाहिए।pthreads प्राथमिकता

अप्रत्याशित रूप से यह सामान्य उपयोगकर्ता के लिए काम करता है, लेकिन यह दी गई प्राथमिकता का सम्मान नहीं करता है।

मैं pthread_attr_t को हटाने के द्वारा और शेड्यूलिंग विशेषता सेटिंग एक बार धागा बनाया गया है द्वारा कोड को संशोधित करने की कोशिश की:

static 
int startup(thrd_t *thrd, thrd_sync_t *sync, int prio) 
{ 
    pthread_attr_t attr; 
    int err; 
    struct sched_param param = { 
     .sched_priority = prio 
    }; 

    err = pthread_create(&thrd->handler, NULL /*&attr*/, thread_routine, 
         (void *)thrd); 
    if (err != 0) return err; 

    err = pthread_setschedparam(thrd->handler, SCHED_FIFO, &param); 
    if (err != 0) return err; 

    return err; 
} 

माध्यम से यह दृष्टिकोण और अधिक कठिन प्रबंधन करने के लिए, के मामले में के बाद से किया गया है त्रुटि मुझे नव निर्मित धागे को मारने की जरूरत है। कम से कम यह अनुमति आवश्यकताओं के संबंध में ठीक से काम करता प्रतीत होता है (केवल रूट इसे निष्पादित कर सकता है), लेकिन फिर भी प्राथमिकताओं का सम्मान नहीं किया जाता है।

क्या मैं कुछ गलत कर रहा हूं?

static 
void getinfo() 
{ 
    struct sched_param param; 
    int policy; 

    sched_getparam(0, &param); 
    DEBUG_FMT("Priority of this process: %d", param.sched_priority); 

    pthread_getschedparam(pthread_self(), &policy, &param); 

    DEBUG_FMT("Priority of the thread: %d, current policy is: %d and should be %d", 
       param.sched_priority, policy, SCHED_FIFO); 
} 
पहले विधि (अर्थात pthread_attr_t दृष्टिकोण) के साथ

यह है कि pthread_attr_setschedpolicy पता चला:

संपादित

मैं सिर्फ कोड का निम्न भाग है जो हर धागा द्वारा निष्पादित किया जाता है जोड़ दिया है पूरी तरह से प्रभावी नहीं है, क्योंकि प्राथमिकता 0 है और नीति SCHED_FIFO नहीं है।

दूसरी विधि (अर्थात् pthread_setschedparam दृष्टिकोण) के साथ फ़ंक्शन अपेक्षित डेटा प्रिंट करता है, लेकिन निष्पादन गलत तरीके से व्यवहार करता रहता है।

+1

आप कैसे निर्धारित करते हैं कि कॉल का सम्मान नहीं किया जाता है? मुझे कुछ ऐसा ही सामना करना पड़ा है, लेकिन एपीआई को बस लागू नहीं किया गया था और इस तरह विफल रहा था। – Ioan

+0

@Ioan: प्रश्न का अद्यतन संस्करण देखें। – Dacav

+1

ओटी: 'assert() 'के अंदर कोड न डालें। यदि यह असर अक्षम के साथ संकलित है, तो कोड निष्पादित नहीं किया जाएगा। – bstpierre

उत्तर

8

मुझे लगता है कि आपको प्राथमिकता सेटिंग में आपके परिवर्तनों को ध्यान में रखकर यह सुनिश्चित करने के लिए pthread_attr_setinheritsched का उपयोग करना होगा। आदमी पृष्ठ से:

PTHREAD_INHERIT_SCHED निर्दिष्ट करता है कि समय-निर्धारण नीति और संबंधित विशेषताओं बनाने धागा से विरासत में मिला हो रहे हैं, और शेड्यूलिंग इस attr बहस में विशेषताओं पर ध्यान नहीं दिया जा करने के लिए कर रहे हैं।

PTHREAD_EXPLICIT_SCHED निर्दिष्ट करता शेड्यूलिंग नीति और संबद्ध गुण हैं कि इस विशेषता वस्तु से संबंधित मानों करने के लिए सेट किया जाना है।

और एक छोटा सा आदमी पेज में आगे, आपके पास:

इनहेरिट-अनुसूचक विशेषता की डिफ़ॉल्ट सेटिंग एक नव प्रारंभ सूत्र में जिम्मेदार बताते वस्तु PTHREAD_INHERIT_SCHED है।

+0

यह काम किया! बहुत बहुत धन्यवाद: यह दो समस्याओं में से एक हल करता है। हालांकि यह प्रतिकूल है: अगर मैं आपको प्राथमिकता निर्दिष्ट कर रहा हूं, शायद ऐसा इसलिए है क्योंकि मैं चाहता हूं कि आप इसका इस्तेमाल करें, है ना? :) अब मुझे गलत व्यवहार का कारण मिलेगा: शायद एक बग? – Dacav

+0

@ डेकाव: क्या आप अपनी दूसरी समस्या को थोड़ा और विस्तारित कर सकते हैं? यकीन नहीं है कि मुझे यह मिल गया है। उस क्षेत्र में कीड़े (लेकिन आपका खुद का ;-) बहुत ही असंभव है। आपने जो सिस्टम चलाया है उसके बारे में आपने बहुत कुछ नहीं कहा है, लेकिन आजकल थ्रेड कार्यान्वयन वास्तव में हर दिन अरबों बार परीक्षण किया जाता है। इस कार्यक्रम के लिए –

+0

मेरा कार्यक्रम सिर्फ एक मचान है: वास्तविक व्यापार तर्क बाद में जोड़ा जाएगा। प्राथमिकता का परीक्षण करने के लिए प्रत्येक धागा एक शर्त चर पर प्रतीक्षा करके शुरू होता है, जिसे बाद में प्रसारित किया जाता है। फिर हर धागा stderr पर फर्जी लिखता रहता है। मुझे उम्मीद है कि कम प्राथमिकता धागे 'से पहले उच्च प्राथमिकता धागे के बोगस पर देख रहे हैं। मुझे संदेह है कि मेरा दोहरे कोर अप्रत्याशित अंतराल के लिए जिम्मेदार है ... मैं अभी एक अच्छा परीक्षण के बारे में सोच रहा हूं। – Dacav

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