2013-10-26 5 views
6

के माध्यम से पूर्णांक मान पास करें मैं बस एक थ्रेड के पूर्णांक के मान को पास करना चाहता हूं।pthread_create

मैं यह कैसे कर सकता हूं?

मैंने कोशिश की:

int i; 
    pthread_t thread_tid[10]; 
    for(i=0; i<10; i++) 
    { 
     pthread_create(&thread_tid[i], NULL, collector, i); 
    } 

धागा विधि इस प्रकार है:

void *collector(void *arg) 
    { 
     int a = (int) arg; 
    ... 

मैं निम्नलिखित चेतावनी मिलती है:

warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 

उत्तर

6

संकलक यदि आप नहीं शिकायत एक शून्य सूचक के लिए i डालें:

pthread_create(&thread_tid[i], NULL, collector, (void*)i); 

कहा कि, कास्टिंग एक सूचक को एक पूर्णांक सख्ती से सुरक्षित नहीं है:

आईएसओ/आईईसी 9899: 201x 6.3.2.3 प्वाइंटर

  1. एक पूर्णांक किसी भी सूचक प्रकार में परिवर्तित किया जा सकता है। जैसा कि पहले निर्दिष्ट किया गया है, परिणाम कार्यान्वयन-परिभाषित है, शायद सही ढंग से गठबंधन नहीं किया जा सकता है, संदर्भित प्रकार की इकाई को इंगित नहीं कर सकता है, और एक जाल प्रतिनिधित्व हो सकता है।

तो आप प्रत्येक थ्रेड के लिए एक अलग सूचक पास करने से बेहतर हैं।

यहाँ एक पूर्ण काम कर उदाहरण है, जो प्रत्येक धागा एक सरणी में एक अलग तत्व के लिए सूचक गुजरता है:

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

void * collector(void* arg) 
{ 
    int* a = (int*)arg; 
    printf("%d\n", *a); 
    return NULL; 
} 

int main() 
{ 
    int i, id[10]; 
    pthread_t thread_tid[10]; 

    for(i = 0; i < 10; i++) { 
     id[i] = i; 
     pthread_create(&thread_tid[i], NULL, collector, (void*)(id + i)); 
    } 

    for(i = 0; i < 10; i++) { 
     pthread_join(thread_tid[i], NULL); 
    } 

    return 0; 
} 

pthreads here के लिए एक अच्छा परिचय नहीं है।

+0

मेरे लिए काम नहीं किया। अनियमित इंडेक्स मिला। हालांकि यह काम किया गया: pthread_create (& thread_tid [i], न्यूल, कलेक्टर, (शून्य *) (आईडी [i])); – Vardit

0

int 32 बिट है, और शून्य * 64 बिट लिनक्स में 64 बिट है; उस स्थिति में आपको int की बजाय लंबी int का उपयोग करना चाहिए;

long int i; 
pthread_create(&thread_id, NULL, fun, (void*)i); 

पूर्णांक मज़ा (शून्य * i) समारोह

long int id = (long int) i; 
1
void *foo(void *i) { 
    int a = *((int *) i); 
    free(i); 
} 

int main { 
    int *arg = (char*)malloc(sizeof(char)) 
    pthread_create(&thread, 0, foo, arg); 
} 
+1

'malloc' गायब है –

0

यह बेहतर करने के लिए एक struct का उपयोग करने में अधिक पैरामीटर भेजने के लिए: तो

struct PARAMS 
{ 
    int i; 
    char c[255]; 
    float f; 
} params; 

pthread_create(&thread_id, NULL, fun, (void*)(&params)); 

आप cast कर सकते हैं params से PARAMS* और pthread 01 में इसका उपयोग:

PARAMS *p = static_cast<PARAMS*>(params); 
p->i = 5; 
strcpy(p->c, "hello"); 
p->f = 45.2; 
संबंधित मुद्दे