На основании ваших комментариев вам нужно сделать что-то вроде этого ...
В вашем основном коде:
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); */
}
В вашей ветке сторожевого пса:
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);
}
В вашей ветке навигации:
void *myNavigationThreadFunc(void *pArgs) {
struct TheStruct *pStruct = (struct TheStruct *)pArgs;
/* use the struct */
/* cleanup */
free(pStruct); /* or pass it to somebody else... */
}
Вы не можете просто сделать:
void PassSomeStuff(struct TheStruct myStruct) {
pthread_create(/* other args */, &myStruct);
}
Потому что myStruct
будет очищен ... когда PassSomeStuff
вернется. Получая адрес (получая указатель на него), не копирует объект.
Примечание:
- ЛЮБОЙ из ваших потоков может очистить структуру, вызывая free, если вы уверены, что ВСЕ потоки закончили с этим.
- ВСЕ потоки (основной, сторожевой, навигация) ссылаются на один и тот же экземпляр структуры (поэтому, если они изменяют его содержимое, вам может понадобиться защитить его с помощью блокировки). Если это нежелательный эффект, вам нужно будет создавать (malloc) новую копию структуры на каждом шаге, чтобы у каждого потока была своя собственная копия значений.