2017-01-15 8 views
0
#define SMALL_STACK 131072 //128K for stack 
pthread_attr_t thread_attr; //for attr 

void* fn(void* arg) 
{ //fn fuction 
    printf("%d", (char *) arg); 
    return NULL; 
} 

int main(int argc, char** argv) 
{ 
    printf("Have "); 
    printf(" arguments:"); //checking multiple arguments 
    for (int i = 0; i < argc; ++i) 
    { 
    printf("%s", argv[i]); 
    } 
    printf("\n"); 
    pthread_attr_init(&thread_attr); 
    pthread_attr_setstacksize(&thread_attr, SMALL_STACK); 
    pthread_t th; //creating thread and stack 

    /* I Need Help (void*)&argv[1] passing this to void *fn function printing the argument coming from command line arguments */ 

    pthread_create(&th, &thread_attr, fn, (void*) &argv[1]); //creating thread 

    return 0; 

} 

ответ

0

На мой взгляд, вы должны передать экземпляр struct в свой параметр резьбы.

Ниже приведен пример:

struct MyThreadData 
{ 
    int argc, 
    char** argv; 
} 

void* fn(void* arg) 
{ 
    MyThreadData* data=(MyThreadData*)arg; 
    /*code*/ 
    return NULL; 
} 

int main(int argc, char** argv) 
{ 
    /*...*/ 
    MyThreadData td={0}; 
    td.argc=argc; 
    td.argv=argv; 

    void* ret = NULL; 
    pthread_create(&th, &thread_attr, fn, (void*)&td); 
    pthread_join(th,&ret) 
} 
+0

Оба слепки ('(недействительными *)' и '(MyThreadData *)') не нужны в С. – alk

+0

Полностью согласен, Я прямо разрешаю этим броскам применять концепцию понимания. –

+0

Какая концепция? Единственная концепция здесь заключается в том, что в C указатель 'void' неявно преобразуется в любой другой указатель и из него. – alk

0

Чтобы передать один аргумент (здесь: 1-е) изменение

pthread_create(&th, &thread_attr, fn, (void*)&argv[1]); 

быть

pthread_create(&th, &thread_attr, fn, argv[1]); 

Чтобы внутри функции потока напечатайте строку используйте правильно спецификатор преобразования:

printf("%s", (char *)arg); 

или в "чистых" способом сделать

void* fn(void* arg) 
{ 
    char * pc = arg; 
    printf("%s\n", pc); /* add a new-line to flush stdout, to 
         have this printed immediately. */ 

Чтобы передать все аргументы затем изменить

pthread_create(&th, &thread_attr, fn, (void*)&argv[1]); 

быть

pthread_create(&th, &thread_attr, fn, argv); 

и настроить функцию нити следующим образом:

void* fn(void* arg) 
{ 
    char ** ppc = arg; 

    while (*ppc) 
    { 
    printf("%s\n", *ppc); 
    ++ppc; 
    } 

    ... 

Также убедитесь, что main() не возвращает стандартный способ, как это затем завершает процесс, который, в свою очередь, заканчивается все нити процесса.

Чтобы сделать это заменить

return 0; 

от

pthread_exit(NULL);