2011-11-05 25 views
5

मैं कोरियाई हूं और मैं अंग्रेजी में अच्छा नहीं हूं लेकिन अगर आप मुझे नीचे टिप्पणी देते हैं तो
मैं बहुत खुश हूं और इसे समझने की कोशिश करूंगा।pthread (सेगमेंटेशन गलती)

मैं उदाहरण के लिए बनाया है,, 10 धागे और निर्माण के बाद उन्हें शामिल होने और मूल्य वापस करने की कोशिश की।
लेकिन जब मैं अंतिम धागे में शामिल होता हूं, तो मुझे एक सेगमेंटेशन गलती मिलती है।

परिणाम इस तरह बाहर आता है ..

Before Thread 1 create 
After Thread 1 create 
Before Thread 0 create 
After Thread 0 create 
Before Thread 1 join 
After Thread 1 join 
Before Thread 0 join 
Segmentation Fault(core dumped) 

जब मैं 4 धागे बनाने यह है

तरह
Before Thread 3 create 
After Thread 3 create 
Before Thread 2 create 
After Thread 2 create 
Before Thread 1 create 
After Thread 1 create 
Before Thread 0 create 
After Thread 0 create 
Before Thread 3 join 
After Thread 3 join 
Before Thread 2 join 
After Thread 2 join 
Before Thread 1 join 
After Thread 1 join 
Before Thread 0 join 
Segmentation Fault(core dumped) 

मैं क्यों खोजने के लिए प्रतीत नहीं कर सकते हैं।

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

pthread_mutex_t mutex_lock; 

struct arg_struct { 
     int a; 
     int b; 
}; 

void *t_function(void *data) { 
     pthread_mutex_lock(&mutex_lock); 

     struct arg_struct *arg = (struct arg_struct *)data; 
     long int s; 

     s = arg->a; 

     pthread_mutex_unlock(&mutex_lock); 

     return (void **)s; 
} 

int main() 
{ 
     int i; 

     pthread_t p_thread[2]; 
     int thr_id; 
     int status; 

     struct arg_struct arg[2]; 

     for(i = 1; i >= 0; i--) { 
       arg[i].a = i; 
       arg[i].b = i; 
     } 

     pthread_mutex_init(&mutex_lock, NULL); 

     for(i = 1; i >= 0; i--) { 
       printf("Before Thread %d create\n", i); 
       thr_id = pthread_create(&p_thread[i],NULL, t_function, (void *)&arg[i]); 
       printf("After Thread %d create\n", i); 
       usleep(1000); 
     } 

     int temp[2]; 

     for(i = 1; i >= 0; i--) { 
       printf("Before Thread %d join\n", i); 
       pthread_join(p_thread[i], (void**)&status); 
       printf("After Thread %d join\n", i); 
       temp[i] = status; 
     }i 

     printf("%d%d", temp[1], temp[0]); 

     pthread_mutex_destroy(&mutex_lock); 

     return 0; 
} 
+0

मैं इस पुन: पेश नहीं कर सकता, मैं 2 और 4 धागे की कोशिश की है। यह Valgrind के अंदर भी, बिल्कुल ठीक काम करता है। क्या आप हमें समस्या के बारे में कुछ और बता सकते हैं? – VolatileDream

+1

क्या आपने डीबगर की कोशिश की है? जीडीबी आपका दोस्त है। – vanza

+1

एसओ में आपका स्वागत है। :-) –

उत्तर

9
pthread_t p_thread[2]; 
    struct arg_struct arg[2]; 
    int temp[2]; 

आप केवल दो तत्वों यहाँ के लिए जगह आवंटित इसलिए यदि आप अधिक से अधिक 2 धागे का शुभारंभ आप सरणी के अंत बंद चलाने के लिए और संभावित दुर्घटना या दूषित ढेर होगा।

इसके अतिरिक्त:

  pthread_join(p_thread[i], (void**)&status); 

status एक int, नहीं एक void * है; इसका प्रयास को int में स्टोर करने का प्रयास करेगा। कई 64-बिट प्लेटफार्मों पर, यह भी होगा अतिप्रवाह (void * के बाद से 8 बाइट्स हो जाएगा 4 है, जबकि int)। status एक void * करें, और इस तरह संकलक त्रुटियों दूर कास्ट करने के लिए कोशिश कर बंद करो। वे एक कारण के लिए त्रुटियां हैं।

+0

जब मैंने 2 से अधिक धागे लॉन्च किए तो मैंने उन नंबरों को बदल दिया। – IKS

+0

अच्छा बिंदु, लेकिन हम अभी भी 2 धागे पर segfault की व्याख्या नहीं कर सकते हैं। – VolatileDream

+0

@ आईकेएस, आपको वह कोड दिखाना होगा जहां आपने उन नंबरों को बदल दिया था, फिर भी यह संभव है कि आप एक को बदलना भूल गए। अभी तक बेहतर, '# परिभाषा' या एक चर का उपयोग शुरू करने के लिए शुरू करें ताकि कितने धागे लॉन्च हो जाएं, और लूप और सरणी आवंटन दोनों को इस चर/मैक्रो का उपयोग असंगतताओं को रोकने के लिए करें। – bdonlan

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