Pase el valor entero a través de pthread_create

Simplemente quiero pasar el valor de un entero a un hilo.

¿Cómo puedo hacer eso?

Lo intenté:

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

El método de subproceso se ve así:

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

Recibo la siguiente advertencia:

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

El comstackdor se quejará si no lo haces en un puntero de vacío:

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

Dicho esto, lanzar un entero a un puntero no es estrictamente seguro:

ISO / IEC 9899: 201x 6.3.2.3 Punteros

  1. Un entero se puede convertir a cualquier tipo de puntero. Excepto como se especificó previamente, el resultado está definido por la implementación, podría no estar alineado correctamente, podría no apuntar a una entidad del tipo al que se hace referencia, y podría ser una representación de trampa.

así que es mejor que pases un puntero por separado a cada hilo.

Aquí hay un ejemplo de trabajo completo, que pasa a cada hilo un puntero a un elemento separado en una matriz:

 #include  #include  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; } 

Hay una buena introducción a pthreads aquí .

 void *foo(void *i) { int a = *((int *) i); free(i); } int main { int *arg = (char*)malloc(sizeof(char)) pthread_create(&thread, 0, foo, arg); } 

int es de 32 bits, y void * es de 64 bits en Linux de 64 bits; En ese caso, debe usar long int en lugar de int;

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

función int fun (void * i)

  long int id = (long int) i; 

Es mejor usar una struct para enviar más parámetros en uno:

 struct PARAMS { int i; char c[255]; float f; } params; pthread_create(&thread_id, NULL, fun, (void*)(&params)); 

entonces puedes cast params a PARAMS* y usarlo en la routine pthread :

 PARAMS *p = static_cast(params); p->i = 5; strcpy(p->c, "hello"); p->f = 45.2;