Ahoj, chtel bych se trochu seznamit s programovanim vicevlaknovych programu v C na linuxu. Mam totiz napsany vlastni jednovlaknovy server a domnivam se, ze pokud mi client zacne delat nejakou slozitou operaci napr. pracovat s databazi (pouzivam SQLite v kombinaci s json-c), tak mi to blokuje dalsi klienty. Abych do stavajiciho jiz odladeneho programu co nejmene zasahoval, vymyslel jsem si tento postup...pokud bude chtit client pristupovat do databaze, tak se tento pozadavek otevre v novem vlakne a jakakoliv dalsi operace totoho clienta bude blokovana dokud vlakno neskonci.
Zjednodusene jsem se to pokusil napsat do kodu, tak jak bych to chtel realizovat a ten zde predkladam. Muj dotaz tedy zni, jestli takto napsany kod bude korektne fungovat a pokud ne, tak jak by to melo vypadat? Ani me nezajima jestli je to takto vhodne resit apod., jde mi jen o princip. Dik za radu.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
static int init_function(void *arg);
static void *handle_function(void *arg);
static pthread_t thread_var = -1;
int main(int argc, char *argv[]){
int ret;
//printf("%ld, %ld\n", thread_var, (long)&thread_var);
while(1){
ret = init_function((void *)&thread_var);
if(ret == 1){
printf("vytvoreno nove vlakno\n");
}
//else if(ret == -1){
// printf("vlakno se nepovedlo vytvorit\n");
// }
//else if(ret == -2){
// printf("vlakno stale bezi\n");
// }
//printf("%ld, %ld\n", thread_var, (long)&thread_var);
}
return 0;
}
static int init_function(void *arg){
pthread_t *p_thread = (pthread_t*)arg;
if(*p_thread != -1){
return -2;
}
if(pthread_create(&thread_var, NULL, handle_function, arg)){
return -1;
}
//printf("%ld, %ld\n", thread_var, (long)&thread_var);
pthread_detach(thread_var);
return 1;
}
static void *handle_function(void *arg){
pthread_t *p_thread = (pthread_t*)arg;
//printf("%ld, %ld\n", *p_thread, (long)p_thread);
sleep(5);
printf("konec vlakna\n");
*p_thread = -1;
return NULL;
}