y_nnn: launch learn when rlAgent ready, add thread attribut in networks to follow thread to avoid mem leak

This commit is contained in:
2025-11-23 18:42:45 +01:00
parent c60e41cf0f
commit b505673bda
4 changed files with 21 additions and 4 deletions
@@ -77,6 +77,8 @@ struct networks_qlearning * create_nework_qlearning(
tmpBest = tmpBest->next_layer; tmpBest = tmpBest->next_layer;
} }
qnets->thread_learn = NULL;
return qnets; return qnets;
@@ -183,6 +185,9 @@ struct RL_agent * create_RL_agent (
rlagent->pprint = pprint ; rlagent->pprint = pprint ;
rlagent->qlearnParams = qlearnParams ; rlagent->qlearnParams = qlearnParams ;
rlagent->networks->thread_learn=malloc(sizeof(pthread_t));
pthread_create(rlagent->networks->thread_learn, NULL, learn_to_drive, (void*)rlagent);
return rlagent; return rlagent;
} }
@@ -191,6 +196,10 @@ void free_networks_qlearning (struct networks_qlearning * networks){
free_neurons_TYPE_FLOAT(networks->target_net); free_neurons_TYPE_FLOAT(networks->target_net);
free_neurons_TYPE_FLOAT(networks->best_net); free_neurons_TYPE_FLOAT(networks->best_net);
free_config_layers(networks->config); free_config_layers(networks->config);
if(networks->thread_learn){
pthread_join(*(networks->thread_learn), NULL);
free(networks->thread_learn);
}
free(networks); free(networks);
} }
void free_status_qlearning(struct status_qlearning *status_ql){ void free_status_qlearning(struct status_qlearning *status_ql){
@@ -86,6 +86,7 @@ struct networks_qlearning {
neurons_TYPE_FLOAT *main_net; neurons_TYPE_FLOAT *main_net;
neurons_TYPE_FLOAT *target_net; neurons_TYPE_FLOAT *target_net;
neurons_TYPE_FLOAT *best_net; neurons_TYPE_FLOAT *best_net;
pthread_t *thread_learn;
}; };
struct RL_agent { struct RL_agent {
@@ -37,10 +37,17 @@ void y_nnn_manager_handle_input(char * buf, int len_buf, void *arg){
kill_all_bash(bash_arg); kill_all_bash(bash_arg);
}else if((strncmp(buf,"kill",4)==0) || (strncmp(buf,"stoplearn",9)==0)){ }else if((strncmp(buf,"kill",4)==0) || (strncmp(buf,"stoplearn",9)==0)){
kill_all_bash(bash_arg); kill_all_bash(bash_arg);
pthread_mutex_lock(rlAgent->status->mut_ending); pthread_mutex_lock(rlAgent->status->mut_ending);
rlAgent->status->ending=1; rlAgent->status->ending=1;
pthread_mutex_unlock(rlAgent->status->mut_ending); pthread_mutex_unlock(rlAgent->status->mut_ending);
pthread_join(*(rlAgent->networks->thread_learn), NULL);
// have to free here to not call pthread_join again when free networks
free(rlAgent->networks->thread_learn);
// set NULL to avoid free again and call join!
rlAgent->networks->thread_learn = NULL;
}else if(strncmp(buf,"stopprint",9)==0){ }else if(strncmp(buf,"stopprint",9)==0){
pthread_mutex_lock(bash_arg->mut_bash_var); pthread_mutex_lock(bash_arg->mut_bash_var);
bash_arg->go_on=0; bash_arg->go_on=0;
+3 -3
View File
@@ -383,8 +383,8 @@ struct status_qlearning *qlstatus = create_status_qlearning ();
qlparams/*struct qlearning_params *qlearnParams*/ qlparams/*struct qlearning_params *qlearnParams*/
); );
pthread_t thread_learn; //pthread_t thread_learn;
pthread_create(&thread_learn, NULL, learn_to_drive, (void*)rlAgent); //pthread_create(&thread_learn, NULL, learn_to_drive, (void*)rlAgent);
//learn_to_drive(rlAgent); //learn_to_drive(rlAgent);
struct arg_bash *bash_arg= create_arg_bash(); struct arg_bash *bash_arg= create_arg_bash();
@@ -405,7 +405,7 @@ struct status_qlearning *qlstatus = create_status_qlearning ();
pthread_join(pollTh, NULL); pthread_join(pollTh, NULL);
pthread_join(thread_learn, NULL); //pthread_join(thread_learn, NULL);
y_socket_free(argS); y_socket_free(argS);
free_arg_var_(var); free_arg_var_(var);