#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
A
ответ
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
Чтобы передать один аргумент (здесь: 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);
Оба слепки ('(недействительными *)' и '(MyThreadData *)') не нужны в С. – alk
Полностью согласен, Я прямо разрешаю этим броскам применять концепцию понимания. –
Какая концепция? Единственная концепция здесь заключается в том, что в C указатель 'void' неявно преобразуется в любой другой указатель и из него. – alk