diff --git a/deepQlearn_0/src/deepQlearning/learn_to_drive.c b/deepQlearn_0/src/deepQlearning/learn_to_drive.c index e08bcfd..33d56f0 100644 --- a/deepQlearn_0/src/deepQlearning/learn_to_drive.c +++ b/deepQlearn_0/src/deepQlearning/learn_to_drive.c @@ -76,6 +76,8 @@ struct networks_qlearning * create_nework_qlearning( tmpTarget= tmpTarget->next_layer; tmpBest = tmpBest->next_layer; } + + qnets->thread_learn = NULL; @@ -183,6 +185,9 @@ struct RL_agent * create_RL_agent ( rlagent->pprint = pprint ; 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; } @@ -191,6 +196,10 @@ void free_networks_qlearning (struct networks_qlearning * networks){ free_neurons_TYPE_FLOAT(networks->target_net); free_neurons_TYPE_FLOAT(networks->best_net); free_config_layers(networks->config); + if(networks->thread_learn){ + pthread_join(*(networks->thread_learn), NULL); + free(networks->thread_learn); + } free(networks); } void free_status_qlearning(struct status_qlearning *status_ql){ diff --git a/deepQlearn_0/src/deepQlearning/learn_to_drive.h b/deepQlearn_0/src/deepQlearning/learn_to_drive.h index aa47c39..380e640 100644 --- a/deepQlearn_0/src/deepQlearning/learn_to_drive.h +++ b/deepQlearn_0/src/deepQlearning/learn_to_drive.h @@ -86,6 +86,7 @@ struct networks_qlearning { neurons_TYPE_FLOAT *main_net; neurons_TYPE_FLOAT *target_net; neurons_TYPE_FLOAT *best_net; + pthread_t *thread_learn; }; struct RL_agent { diff --git a/y_network_neural_network_/src/y_net_neur_net/y_nnn_manager.c b/y_network_neural_network_/src/y_net_neur_net/y_nnn_manager.c index 3712413..97c11b8 100644 --- a/y_network_neural_network_/src/y_net_neur_net/y_nnn_manager.c +++ b/y_network_neural_network_/src/y_net_neur_net/y_nnn_manager.c @@ -37,10 +37,17 @@ void y_nnn_manager_handle_input(char * buf, int len_buf, void *arg){ kill_all_bash(bash_arg); }else if((strncmp(buf,"kill",4)==0) || (strncmp(buf,"stoplearn",9)==0)){ kill_all_bash(bash_arg); - pthread_mutex_lock(rlAgent->status->mut_ending); + + pthread_mutex_lock(rlAgent->status->mut_ending); rlAgent->status->ending=1; 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){ pthread_mutex_lock(bash_arg->mut_bash_var); bash_arg->go_on=0; diff --git a/y_network_neural_network_/test/is_good.c b/y_network_neural_network_/test/is_good.c index 07adb30..ac1fc8c 100644 --- a/y_network_neural_network_/test/is_good.c +++ b/y_network_neural_network_/test/is_good.c @@ -383,8 +383,8 @@ struct status_qlearning *qlstatus = create_status_qlearning (); qlparams/*struct qlearning_params *qlearnParams*/ ); - pthread_t thread_learn; - pthread_create(&thread_learn, NULL, learn_to_drive, (void*)rlAgent); + //pthread_t thread_learn; + //pthread_create(&thread_learn, NULL, learn_to_drive, (void*)rlAgent); //learn_to_drive(rlAgent); 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(thread_learn, NULL); + //pthread_join(thread_learn, NULL); y_socket_free(argS); free_arg_var_(var);