मैंने linux पर pthread प्रोग्रामिंग करना शुरू कर दिया और पहले ही प्रोग्राम में मैं पूरी तरह से भ्रमित हो गया। नीचे वह प्रोग्राम है जो मैं चला रहा हूँ

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *print_message_function( void *ptr );

int main(){
 pthread_t thread1, thread2;
 char *message1 = "Thread 1";
 char *message2 = "Thread 2";
 int  iret1, iret2;

/* Create independent threads each of which will execute function */

 iret1 = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
 iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message2);

 /* Wait till threads are complete before main continues. Unless we  */
 /* wait we run the risk of executing an exit which will terminate   */
 /* the process and all threads before the threads have completed.   */

 pthread_join( thread1, NULL);
 printf("amit");
 pthread_join( thread2, NULL); 

 printf("Thread 1 returns: %d\n",iret1);
 printf("Thread 2 returns: %d\n",iret2);
 exit(0);
}

void *print_message_function( void *ptr ){
 char *message;
 message = (char *) ptr;
 printf("%s \n", message);
}

पहली बात जो मैं जानना चाहूंगा वह है थ्रेड निष्पादन का क्रम अनुक्रमिक नहीं है ??

दूसरी बात यह है कि मैं जानबूझकर प्रिंट ("अमित") डालता हूं; मुख्य देखने के लिए थ्रेड 1 के समाप्त होने के दौरान वास्तव में रुक जाता है लेकिन आउटपुट में हम जो देख सकते हैं वह प्रिंटफ स्टेटमेंट पहले निष्पादित होता है। पूरी प्रक्रिया का आउटपुट है

धागा १

धागा २

अमित थ्रेड 1 रिटर्न: 0

थ्रेड 2 रिटर्न: 0

3
Amit Singh Tomar 14 फरवरी 2011, 14:11
6
"थ्रेड निष्पादन का क्रम अनुक्रमिक नहीं है"। यह सही है। यदि आपको लगता है कि यहां पूछने के लिए पर्याप्त आश्चर्यजनक है, तो कृपया कोड से दूर कदम उठाएं और बहु-थ्रेडेड प्रोग्रामिंग पुस्तक ढूंढें। कृपया किताब को पूरा पढ़ें। कम या ज्यादा यादृच्छिक कोड लिखने से पहले आप एक अच्छे ट्यूटोरियल की तलाश कर सकते हैं। विषय काफी जटिल है और इस तरह की चीज का बेतरतीब ढंग से पता नहीं लगाया जा सकता है। computing.llnl.gov/tutorials/pthreads
 – 
S.Lott
14 फरवरी 2011, 14:15
क्या यह वास्तव में आउटपुट है? यह amit के बजाय ajay आउटपुट करता है? आपका सवाल क्या हैं?
 – 
Falmarri
14 फरवरी 2011, 14:16
1
Thansk @Lott, मुझे लगता है कि मुझे पहले मूल बातें सीखने की जरूरत है ...
 – 
Amit Singh Tomar
14 फरवरी 2011, 14:22
और अलग मशीन पर एक और चीज अलग ओ / पी . हो रही है
 – 
Amit Singh Tomar
14 फरवरी 2011, 14:36

2 जवाब

सबसे बढ़िया उत्तर

पहली बात जो मैं जानना चाहूंगा वह यह है कि थ्रेड निष्पादन का क्रम अनुक्रमिक नहीं है?

सामान्य रूप से नहीं। अधिकांश आधुनिक ऑपरेटिंग सिस्टम पर थ्रेड्स (लिनक्स पर प्रारंभिक थ्रेडिंग कार्यान्वयन सहकारी मल्टीटास्किंग का उपयोग करते हैं) समानांतर में निष्पादित होते हैं और जिस क्रम में आपके printf निष्पादित होते हैं वह आंशिक रूप से गैर-निर्धारक होता है। pthread_join चीजों पर कुछ आदेश लगाते हैं, इसलिए:

  • Thread 1 को Amit से पहले आना चाहिए क्योंकि प्रिंट करने से पहले मुख्य धागा थ्रेड 1 के खत्म होने की प्रतीक्षा करता है Amit1
  • Thread 2 को Thread 1 returns: से पहले आना चाहिए क्योंकि दूसरा pthread_join है। सभी printf main में उसी क्रम में दिखाई देते हैं जिस क्रम में वे main में दिखाई देते हैं।

मुझे उम्मीद है इससे आपको अपने प्रश्न का उत्तर मिल गया। मुझे पूरा यकीन नहीं है कि आप क्या पूछ रहे थे लेकिन किसी भी बिंदु पर स्पष्टीकरण मांगने में संकोच न करें।

2
JeremyP 14 फरवरी 2011, 14:59
लेकिन केवल एक चीज जो मुझे भ्रमित कर रही है वह यह है कि क्यों प्रिंटफ ("अमित"); pthread_join (थ्रेड 1, न्यूल) से पहले निष्पादित हो जाता है; , क्या यह अपेक्षित है ??
 – 
Amit Singh Tomar
15 फरवरी 2011, 09:07
@AMIT: आपके द्वारा पोस्ट किए गए आउटपुट के अनुसार printf("amit") लाइन को pthread_join(thread, NULL) से पहले कॉल नहीं किया जाता है।
 – 
JeremyP
15 फरवरी 2011, 11:56

आप सही कह रहे हैं कि थ्रेड निष्पादन का क्रम अनुक्रमिक नहीं है। कुछ हद तक, धागे का उपयोग करने का पूरा बिंदु है, यानी अन्य कार्यों को एक साथ चलाने के लिए।

आप जो आउटपुट देख रहे हैं वह अपेक्षित है, और संभवतः भिन्न हो सकता है।

शायद यह मदद करेगा:

   main            thread1     thread2
    |                
    |--create--------+-----------\
    |                |           |   
    |            "Thread 1"      |   "Thread 2" can
    |                |           |<- occur anywhere
    |               /            |   along this line
   join(1) ---------             |
    |                            |
    |                            |
  "amit"                         |
    |                            |
    |                            |
   join(2) ---------------------/
    |
    |
"Thread 1 returns"
"Thread 2 returns"
    |
  exit(0)

आपके पास केवल गारंटी है:

  • "Thread 1" हमेशा "amit" से पहले प्रिंट किया जाएगा (क्योंकि pthread_join() मुख्य कार्यक्रम के आगे बढ़ने से पहले थ्रेड 1 के समाप्त होने की प्रतीक्षा करता है)
  • "Thread X returns ..." कथन हमेशा अंत में आएंगे, दोनों थ्रेड समाप्त होने के बाद।
12
Shawn Chin 14 फरवरी 2011, 15:06