2011-10-07 17 views
16

nice के लिए आदमी पृष्ठ कहते हैं, "अच्छा() बुला प्रक्रिया के लिए अच्छा मूल्य तो, हम इसका इस्तेमाल pthread_createअच्छा है() थ्रेड प्राथमिकता या प्रक्रिया प्राथमिकता को बदलने के लिए उपयोग किया जाता है? ।? :

संपादित द्वारा बनाई गई एक धागा के लिए अच्छा मान बदलने के लिए कर सकते हैं करने के लिए इंक कहते हैं ऐसा लगता है कि हम प्रति थ्रेड अच्छा मूल्य निर्धारित कर सकते हैं।

मैंने एक आवेदन लिखा, विभिन्न धागे के लिए अलग-अलग अच्छे मूल्य को निर्धारित किया, और पाया कि "अच्छा" धागा कम प्राथमिकता के साथ निर्धारित किया गया है। आउटपुट की जांच, मैं पाया गया कि स्ट्रिंग "उच्च प्राथमिकता ................" अधिक बार आउटपुट प्राप्त करें।

void * thread_function1(void *arg) 
{ 

pid_t tid = syscall(SYS_gettid); 

int ret = setpriority(PRIO_PROCESS, tid, -10); 
printf("tid of high priority thread %d , %d\n",tid ,getpriority(PRIO_PROCESS,tid)); 
while(1){ 
    printf("high priority ................\n"); 
    } 

} 


void * thread_function(void *arg) 
{ 
pid_t tid = syscall(SYS_gettid); 
int ret = setpriority(PRIO_PROCESS, tid, 10); 
printf("tid of low priority thread %d , %d \n",tid ,getpriority(PRIO_PROCESS,tid)); 
while(1) 
{ 

    printf("lower priority\n"); 
} 
} 


int main() 
{ 

pthread_t id1; 
pthread_t id2; 

pid_t pid = getpid(); 
pid_t tid = syscall(SYS_gettid); 

printf("main thread : pid = %d , tid = %d \n" , pid, tid); 
pthread_create(&id1, NULL, thread_function1, NULL); 
pthread_create(&id2, NULL,thread_function, NULL); 

pthread_join(id1, NULL); 
pthread_join(id2, NULL); 


} 

उत्तर

21

pthreads man page का कहना है:

POSIX.1 भी जरूरी है धागे अन्य विशेषताओं की एक श्रृंखला का हिस्सा है कि (यानी, इन विशेषताओं प्रक्रिया चौड़ा बल्कि प्रति-धागा से कर रहे हैं):

[ ...]

  • अच्छा मूल्य (setpriority (2))

तो, सैद्धांतिक रूप से, "अच्छीता" मान प्रक्रिया के लिए वैश्विक है और सभी धागे द्वारा साझा किया गया है, और आप एक या अधिक व्यक्तिगत धागे के लिए एक विशिष्ट विशिष्टता सेट करने में सक्षम नहीं होना चाहिए।

हालांकि, बहुत ही आदमी पेज भी कहते हैं:

LinuxThreads

इस कार्यान्वयन की उल्लेखनीय विशेषताओं निम्नलिखित हैं:

[...]

  • थ्रेड एक सामान्य अच्छा मूल्य साझा नहीं करते हैं।

NPTL

[...]

NPTL अभी भी POSIX.1 के साथ कुछ गैर conformances है:

  • धागे एक आम अच्छा मूल्य का हिस्सा नहीं है।

तो यह पता चला है कि दोनों लिनक्स पर कार्यान्वयन सूत्रण (LinuxThreads और NPTL) वास्तव में POSIX.1 उल्लंघन करते हैं, और आप इन पर setpriority() करने के लिए एक tid पास करके एक या एकाधिक व्यक्तिगत धागे के लिए एक विशिष्ट सुंदरता सेट कर सकते हैं सिस्टम।

+1

लेकिन क्यों कुछ जेवीएम कार्यान्वयन में, जावा थ्रेड प्राथमिकता में 1: 1 मैपिंग अच्छा मूल्य है? //www.javamex.com/tutorials/threads/priority_what।shtml इसके अलावा, मैंने एक एप्लीकेशन लिखा, अलग-अलग थ्रेड के लिए अंतर को अच्छी तरह से सेट किया, और देखा कि आउटपुट कितनी बार है यह जांचकर निसर थ्रेड को कम प्राथमिकता के साथ निर्धारित किया गया है। – pierrotlefou

+0

@pierr, दिलचस्प, यह पता चला है कि एनपीटीएल और लिनक्स थ्रेड दोनों POSIX.1 का उल्लंघन करते हैं। मैं अपना जवाब अपडेट करूंगा। –

+0

@ FrédéricHamidi क्या यह अभी भी वही मामला है कि लिनक्स पर धागे एक सामान्य अच्छा मूल्य साझा नहीं करते हैं? – blueskin