Sobre la base de sus comentarios que hay que hacer algo como esto ...
En su código principal:
void PassSomeStuff(struct TheStruct myStruct) {
struct TheStruct *pStruct = malloc(sizeof(struct TheStruct));
memcpy(pStruct, &myStruct, sizeof(struct TheStruct));
/* Start the watchdog thread passing in the structure */
pthread_create(/* other args */, &myWatchDogThreadFunc, pStruct); */
}
En su flujo watchdog:
void *myWatchDogThreadFunc(void *pArgs) {
struct TheStruct *pStruct = (struct TheStruct *)pArgs;
/* use the struct */
/* Pass Ownership to the navigation thread*/
/* Start the navigation thread passing in the structure */
pthread_create(/* other args */, &myNavigationThreadFunc, pStruct);
}
En el hilo de navegación :
void *myNavigationThreadFunc(void *pArgs) {
struct TheStruct *pStruct = (struct TheStruct *)pArgs;
/* use the struct */
/* cleanup */
free(pStruct); /* or pass it to somebody else... */
}
No se puede hacer:
void PassSomeStuff(struct TheStruct myStruct) {
pthread_create(/* other args */, &myStruct);
}
Debido myStruct
obtendrá limpiado ... PassSomeStuff
cuando regresa. Tomando la dirección (obteniendo un puntero), no copia el objeto.
Nota:
- cualquiera de sus hilos puede limpiar la estructura llamando gratis, siempre y cuando usted puede estar seguro de que todos los hilos terminado con él.
- TODOS los hilos (principal, watchdog, navegación) hacen referencia a la misma instancia de la estructura (por lo que si cambian su contenido, es posible que deba protegerlo con el bloqueo). Si este no es el efecto deseado, entonces necesitaría crear (malloc) una nueva copia de la estructura en cada paso, de modo que cada hilo tenga su propia copia de los valores.
Para pasar una estructura, necesita pasar la dirección de la misma (que la convierte en un puntero). Sin embargo, debe asegurarse de que el objeto no se destruya (ya que el hilo tendrá una referencia). Sí, puede pasar cualquier puntero a un vacío * – forsvarir
No puede (AFAIK). ¿Qué hay de malo con un puntero a una estructura basada en montón? –
¿No puedo simplemente enviar la estructura como esta y la estructura al (vacío *) – jarryd