Как передать более одного значения в качестве аргумента потока в C? - PullRequest
2 голосов
/ 19 декабря 2011

В C, как я могу передать более одного аргумента в поток?

Обычно я делаю это так, как

 pthread_create(&th,NULL,dosomething,(void*)connfd);


void * dosomething(void *connfd)
{

  // Doing something      

}

В приведенном выше примере я передаю значение connfd только в поток 'th'.

Есть ли способ передать более одного значения, чтобы оно могло быть очень полезным для меня?

Еще одна вещь, можем ли мы передать массив в качестве аргумента потоку?

Ответы [ 3 ]

7 голосов
/ 19 декабря 2011

Упакуйте несколько значений в struct в куче (поэтому malloc и заполните его раньше), затем вызовите pthread_create с указателем на struct.

2 голосов
/ 28 октября 2012
#include <stdio.h> 
#include <stdlib.h>
#include <pthread.h> 

void *genSimpleCurList(void *pnum) {
   void  *retval;

   int i,j;

   j = 0;

    // when ptread_create , how to pass a parameters such as integer arrary to pthread

   while(j<10) {
     i =*((int *)pnum)+j;
     fprintf(stderr,"pthread creat with parameter is %d\n",i);
     j++;
    } 

  return(retval);

 }

 int  main() {

 int i, *j;
 pthread_t idxtid;
 pthread_attr_t attr;
 pthread_attr_init (&attr);
 pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);

 j = (int *) calloc (1024, sizeof (int));
  for (i = 0; i < 1024; i++) j[i] = i;

  rcode = pthread_create (&idxtid, &attr, genSimpleCurList, (void *)j);

  exit(0);
 } 
1 голос
/ 19 декабря 2011

Что касается передачи массива в качестве аргумента, конечно, вы можете это сделать. Если вы объявите массив как,

int a[3] = {1,2,2};

a похоже на метку начального адреса массива. Таким образом, a представляет указатель. *a равно a[0] и *(a+1) равно a[1]. Таким образом, вы можете передать массив в поток, как показано ниже:

pthread_create(&th,NULL,dosomething,(void *)a);

Внутри потока вы можете привести a обратно к int * и использовать в качестве массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...