Oui les threads partagent le meme adressage memoire. Ainsi le plus simple (mais c'est assez dangereux dans un programme complexe, et puis c est pas tres propre), c est d utiliser des variables globales. Tout les threads y ont acces et tous peuvent ecrire. Cependant des que tu as des fonctions concurrentes, cela pose probleme. Tu peux alors utiliser des flags (blocage de la valeur le temps qu une fonction y accede) ou des semaphores. Il y a d'autres utilisations pour l exclusion mutuelle mais ces deux là sont faciles a prendre en main (en tout cas sous Linux !). Je te post le code du main d un serveur que j ai fait l annee derniere, c est donc assez recent ;)
int main()
{
/* Variables Network */
struct sockaddr_in sin1;
struct sockaddr_in sin2;
struct sockaddr_in cliaddr1,cliaddr2;
struct sigaction sa;
int fd1,new_fd1;
int fd2,new_fd2;
int address_size;
int maxfd;
pid_t childpid;
socklen_t clilen1,clilen2;
fd_set rset;
pthread_t w1;
pthread_t server_th;
pthread_t server_th2;
/* Variables Video */
char *videodevice = "/dev/video0";
int format = VIDEO_PALETTE_YUV420P;
int width = 640;
int height = 480;
/* Variables Temp */
char buf[16384];
int err,re,i,len;
/* Initialisation de la video en mode mmap par defaut */
printf("%sVideo initialization in progress ...%s\n",ppurple,pnormal);
memset (&videoIn, 0, sizeof (struct vdIn));
if (init_videoIn(&videoIn, videodevice, width, height, format,1) != 0)
printf ("%sInitialisation error !%s\n",pred,pnormal);
printf("%sVideo initialization correctly done !%s\n",ppurple,pnormal);
/* Creation du thread pour le Grab */
if((err= pthread_create (&w1, NULL, (void *) grab, NULL)) != 0)
{
printf("%sGrab creation thread error %d %s\n",pred,err,pnormal);
close_v4l (&videoIn);
exit(1);
}
/* Socket UDP */
if((fd1=socket(AF_INET,SOCK_DGRAM,0))==-1)
erreur("socket");
/* Socket TCP */
if((fd2=socket(AF_INET,SOCK_STREAM,0))==-1)
erreur("socket");
bzero(&sin1,sizeof(sin1));
sin1.sin_family=AF_INET;
sin1.sin_addr.s_addr=INADDR_ANY;
sin1.sin_port=htons(port1);
bzero(&sin2,sizeof(sin2));
sin2.sin_family=AF_INET;
sin2.sin_addr.s_addr=INADDR_ANY;
sin2.sin_port=htons(port2);
printf("%sBinding ...%s\n",pgreen,pnormal);
if(bind(fd1,(struct sockaddr*)&sin1,sizeof(sin1))==-1)
erreur("bind");
if(bind(fd2,(struct sockaddr*)&sin2,sizeof(sin2))==-1)
erreur("bind");
printf("%sListening ...%s\n",pgreen,pnormal);
if(listen(fd2,20)==-1)
erreur("listen");
/* Ignore sigpipe */
signal(SIGPIPE, SIG_IGN);
sa.sa_handler = sigchld_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
printf("%sWaiting for connection ...%s\n",pblue,pnormal);
signal(SIGCHLD,sig_handle);
FD_ZERO(&rset);
/* Beginning Client Loop */
for(;;)
{
FD_SET(fd1,&rset);
FD_SET(fd2,&rset);
maxfd=max(fd1,fd2)+1;
if (select(maxfd,&rset,NULL,NULL,NULL)<0)
{
if(errno==EINTR)
continue;
else
{
printf("Select error : %s\n",strerror(errno));
exit(1);
}
}
/* Socket UDP */
if(FD_ISSET(fd1,&rset))
{
//printf("%s[%sUDP%s] Connection acquired from (%s%s%s)%s\n",pblue,pred,pblue,ppurple,inet_ntoa(cliaddr1.sin_addr),pblue,pnormal);
pthread_create(&server_th2, NULL, (void *)service_udp, &fd1);
}
/* Socket TCP */
if(FD_ISSET(fd2,&rset))
{
clilen2=sizeof(cliaddr2);
if((new_fd2=accept(fd2,(struct sockaddr*)&cliaddr2,&clilen2))<0)
{
if(errno==EINTR)
continue;
else
{
printf("accept error \n");
exit(1);
}
}
printf("%s[%sTCP%s] Connection acquired from (%s%s%s)%s\n",pblue,pred,pblue,ppurple,inet_ntoa(cliaddr2.sin_addr),pblue,pnormal);
/* Creation d'un thread par client */
pthread_create(&server_th, NULL, (void *)service, &new_fd2);
}
} /* Fin du For */
/* En attente de l'arret du thread Grab */
pthread_join (w1, NULL);
/* Fermeture programme */
close(fd1);
close(fd2);
close_v4l (&videoIn);
exit(0);
}