मैं अलग प्राथमिकताओं होने धागे का एक पूल का प्रबंधन करने की जरूरत है, तो मैं निम्नलिखित धागा स्टार्टअप प्रक्रिया लिखा है: उच्च प्राथमिकता वाले धागे को चलाने के सुरक्षा प्रभावों के कारण 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, ¶m);
if (err != 0) return err;
return err;
}
माध्यम से यह दृष्टिकोण और अधिक कठिन प्रबंधन करने के लिए, के मामले में के बाद से किया गया है त्रुटि मुझे नव निर्मित धागे को मारने की जरूरत है। कम से कम यह अनुमति आवश्यकताओं के संबंध में ठीक से काम करता प्रतीत होता है (केवल रूट इसे निष्पादित कर सकता है), लेकिन फिर भी प्राथमिकताओं का सम्मान नहीं किया जाता है।
क्या मैं कुछ गलत कर रहा हूं?
static
void getinfo()
{
struct sched_param param;
int policy;
sched_getparam(0, ¶m);
DEBUG_FMT("Priority of this process: %d", param.sched_priority);
pthread_getschedparam(pthread_self(), &policy, ¶m);
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
दृष्टिकोण) के साथ फ़ंक्शन अपेक्षित डेटा प्रिंट करता है, लेकिन निष्पादन गलत तरीके से व्यवहार करता रहता है।
आप कैसे निर्धारित करते हैं कि कॉल का सम्मान नहीं किया जाता है? मुझे कुछ ऐसा ही सामना करना पड़ा है, लेकिन एपीआई को बस लागू नहीं किया गया था और इस तरह विफल रहा था। – Ioan
@Ioan: प्रश्न का अद्यतन संस्करण देखें। – Dacav
ओटी: 'assert() 'के अंदर कोड न डालें। यदि यह असर अक्षम के साथ संकलित है, तो कोड निष्पादित नहीं किया जाएगा। – bstpierre