编程知识 cdmana.com

C + + passe des paramètres dans plusieurs Threads via des variables globales de structure

Langage de programmation: c++

Environnement opérationnel:Linux version 4.19.42-v7+ (dom@dom-XPS-13-9370) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) #1219 SMP Tue May 14 21:20:58 BST 2019

Objectifs:Quand un thread tourne,Le programme principal ou un autre thread,Modifier la variable cible en temps réel en changeant la variable globale,Comme ici.,Le propriétaire, c'est moi,Pour lancer untcpThread client pour la structure,Et les données recueillies par le fil de la caméra passent en temps réeltcpLe thread client traite et renvoie au serveur(C'est un transfert de données entre deux fils seulement,N'oubliez pas d'utiliser le mutex thread,Éviter les erreurs de données)

D'abord?,Vous n'avez pas besoin de structures,Il suffit de définir une variable globale pour l'utiliser directement,Beaucoup mieux en termes d'encapsulation et de cohérence avec les diagrammes de structure,Surtout quand il faut définir plusieurs paramètres du même type( ̄△ ̄)

Exemple 1:Exemple d'interaction paramétrique entre le thread et le programme principal en utilisant directement des variables globales
Description du processus:
1. Nous avons d'abord définifloatVariable globale de type cha_zuo_you = 0;
2.Il y a aussi une définition qui s'appellejudjeFonction de,Pour les fonctions thread
3.Bien joué., Commençons par la fonction principale ,Dans la fonction principale, Créer un numéro de fil existe thread1Thread in
4,Poursuivre le programme principal, Faire des variables globales cha_zuo_youTous les2 Une seconde plus un
5. Pendant que le programme principal est exécuté ,Threadthread1 Et commencer à exécuter son programme ,Imprimer les variables globales cha_zuo_youValeur de, Notez que les variables globales sont imprimées ici cha_zuo_youQuand ça en vaut la peine., Le programme principal traite également des variables globales cha_zuo_you Valeur modifiée pour , Donc si nous enlevons sleepFonctions, Il est possible d'imprimer plusieurs valeurs identiques au cours d'une période donnée ou , Imprimer d'autres valeurs .

Insérer un morceau de code ici
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <sstream>

pthread_t thread1;// Créer un nom de fil 

float cha_zuo_you = 0;//Variables globales


void * judje(void *arg)// Notez que les fonctions utilisées par les Threads ici sont signalisées. ,
//Référence à la cause spécifiquepthread_createDéfinition de la fonction*(Fouillez - vous.)
{
      
 while(1)
 	{
    
	 
	  printf(" ThreadjudjeVariables de sortiecha_zuo_youLa valeur de: %f, Et un délai de deux secondes  \n ",cha_zuo_you);
	  sleep(2);
 	 }
 

}
int main(void)
{
    
	pthread_attr_t attr;
	pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    //(Ci - dessus3 La phrase est utilisée pour définir les propriétés du thread ,
    //C'est réglé àPTHREAD_CREATE_DETACHED  Alors le nouveau thread ne 
    //Ça marchepthread_join()Pour synchroniser, Et libérez les ressources occupées par vous - même à la sortie .)
	
	if (0 != pthread_create(&thread1, &attr, judje, NULL   ))//
		{
    
		printf("error when create pthread,%d\n", errno);
		return 1;
		}
			 
	 while(1)
	 {
    
		 cha_zuo_you = cha_zuo_you + 1;
		 printf(" Le programme principal va changer cha_zuo_you Plus un délai de deux secondes \n");
		 sleep(2);
		 		 
	 }

}

Les effets de fonctionnement sont les suivants
 Exemple 1 Diagramme d'exécution

Exemple 2: Ensuite, nous ajoutons un structStructure


struct dir_motor
{
     
    float a = 10;
	
    float *left_right = &cha_zuo_you;//Paramètres1 
    float *top_under = &cha_qian_hou;
	float *Re_lv = &Relative_distance;

};

Description du processus( Là où il y a des changements, j'utilise l'italique et ^^):
1. ^^D'abord défini4- Oui.floatVariable globale de type (Inclure des variables globalescha_zuo_you );
2 ^^Il a défini undir_motorStructure de

3. Il a défini un nom judjeFonction de,Pour les fonctions thread
3.Bien joué., Commençons par la fonction principale ,Dans la fonction principale, Créer un numéro de fil existe thread1Thread in
4,Poursuivre le programme principal, Faire des variables globales cha_zuo_youTous les2 Une seconde plus un
*5.^^ Pendant que le programme principal est exécuté ,Threadthread1 Et commencer à exécuter son programme ,Adoptioncorrect_num Quelle est la variable globale à imprimer? (Ici.correct_numPour1 Alors Imprimez les variables globales cha_zuo_youValeur de),
Ce qui est remarquable cette fois, c'est qu'il est imprimé ici. structDéfini à l'intérieuraValeur de, Utilisé pour comparer les différences lors de l'impression
C'est - à - dire:



p = pstru->left_right;//left_rightC'est unfloat *Pointeur de type,
printf(" Exporter des variables globalescha_zuo_youLa valeur de est égale à: %f \n ",*(p));
printf("ProduitsaValeur du type%f\n",pstru->a);

//… Je suis la ligne de démarcation …

Voici la structure (struct) Exemple de code simple pour les variables globales passant des paramètres dans plusieurs threads , Notez que les variables globales sont utilisées dans la structure dir_motor Définitions et types de variables propres aux classes de structures ordinaires (C'est - à - dire:a) Différence entre la définition de

 Voici un résumé pour vous aider à comprendre le programme , Il est recommandé de lire le programme et de le comprendre en même temps que le diagramme ci - dessous. ,Bien sûr, si vous avez raison.c
 Le pointeur dans la compréhension profonde , Regarde le programme. 

Voici un résumé pour vous aider à comprendre le programme , Il est recommandé de regarder le programme et d'ajouter le diagramme ci - dessous. ( C'est un peu moche. Il est recommandé d'enregistrer l'image dans le sens contraire des aiguilles d'une montre. 90Regarde, N'importe quoi. , Cet article n'est publié que sur CSDNOui., Si un numéro public passe , Comme original ou payant. , N'oubliez pas de me prévenir. , Bien qu'à un niveau moyen )Comprendre ensemble,Bien sûr, si vous avez raison.c Le pointeur dans la compréhension profonde , Regarde le programme.

Tout d'abord, supposons que :
Le type estfloat Type d'astérisque *left_right L'adresse de0x01
Le type estfloatType cha_zuo_you L'adresse de0x11
Le type eststruct dir_motor Type d'astérisque pstru L'adresse de0x56

Voici la procédure pour obtenir ce qui suit:

1.pstru->left_right Ça veut dire pstruAdresse(C'est - à - dire:0x56)Valeur stockée dans0x01 La variable pour l'adresse est left_right( C'est pourquoi la sortie dans le thread cha_zuo_youQuand la valeur depstru->left_right Raison de l'astérisque )
2.pstru->aExprimé parpstruAdresse(C'est - à - dire:0x56)Valeur stockée dans0x66 La valeur de la variable pour l'adresse est 10.000000
(En fait,pstruAdresse0x56Stocké4 Les adresses sont dir_motor Celui de la classe structure 4 Les valeurs stockées dans les types d'adresses sont: dir_motor Les structures comme ça 4Adresse de, Bien sûr, c'est inexact. , La quantité de stockage d'un espace d'adresse physique est limitée , En fait, ça s'appelle pstru L'espace d'adresse de ce nom est dans dir_motor La structure définit plus d'un espace d'adresse dans le cas de nombreuses variables , Pour faciliter la compréhension de cet espace d'adresse 0x56C'est))
3.left_rightL'adresse de la variable est0x01
4.*left_rightExprimé parleft_right Adresse de la variable (C'est - à - dire:0x01) Valeur stockée dans 0x11 Valeur de la variable pour l'adresse (C'est - à - dire:0),C'est - à - dire: *left_right = 0 ( Bien sûr, le programme principal 2 Les secondes s'additionnent 1Oui.)
Insérer la description de l'image ici


#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <iostream>
#include <sstream>

pthread_t thread1;

int correct_num = 1;
float Relative_distance = 0;
float cha_zuo_you = 0;
float cha_qian_hou = 0;

struct dir_motor
{
     
    float a = 10;
	
    float *left_right = &cha_zuo_you;//Paramètres1 
    float *top_under = &cha_qian_hou;
	float *Re_lv = &Relative_distance;

};
struct dir_motor pstru1; 
//00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

//
void * judje(void *arg)
{
         


    int num;
	float *p;
	dir_motor *pstru; 
	pstru = (struct dir_motor *) arg; 
	//(C'est exact.argConversion forcée de type pour, Il est sur le point de  Passer dans cejudje De la fonction thread dir_motorType
	//Depstru1Variable Pointeurarg  L'espace de type pointé devient dir_motorType )
	                                  // Un peu de compréhension 
	
	


			switch (correct_num)//(Via les variables globalescorrect_num Sélectionnez le pointeur p
			// Quel type de ( Ça veut dire left_right Le pointeur pointe vers cha_zuo_youDe
			//Adresse)
			{
    
				
				case 1:
					p = pstru->left_right;//left_rightC'est unfloat *Pointeur de type,
					correct_num = correct_num + 1;
				    num = 1;
					
				    break;

				case 2:
					p = pstru->left_right;
					correct_num = correct_num + 1;
				    num = 2;
				
				    break;
				case 3:
					p = pstru->top_under;
					correct_num = correct_num + 1;
				    num = 3;
					
				    break;
				case 4:
					p = pstru->top_under;
					correct_num = correct_num + 1;
				    num = 4;
			
				    break;
				case 5:
					p = pstru->Re_lv;
					correct_num = correct_num + 1;
				    num = 5;
				
				    break;

			}
			

 while(1)
 	{
    
	  printf("ProduitsaValeur du type%f\n",pstru->a);
	  printf(" ThreadjudjeVariables de sortiecha_zuo_youLa valeur de: %f, Et un délai de deux secondes  \n ",*(p));
	  sleep(2);
				

 	 }
 

}
int main(void)
{
    
	pthread_attr_t attr;
	pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
	
	if (0 != pthread_create(&thread1, &attr, judje, &pstru1   ))//Ce qui sera définipstruAdresse:judje Pointeur défini dans pstruÇa veut dire
		{
    
		printf("error when create pthread,%d\n", errno);
		return 1;
		}
		


	 
	 while(1)
	 {
    
		 cha_zuo_you = cha_zuo_you + 1;
		 printf(" Le programme principal va changer cha_zuo_you Plus un délai de deux secondes \n");
		 sleep(2);
		 
		 
	 }



}


Voici l'illustration de l'exemple 2
 Exemple 2 Diagramme de fonctionnement

Oui.,linux Le fichier suivant est ici. , C'est la même chose. ,
Compiler avecmake,J'ai échoué.(cpp Pas de réponse )
Ou vous voulez reconstruire le fichier compilé , Le nom du fichier compilé lui - même est dans CMakeLists.txt Supprimer d'autres fichiers pour sauvegarder seulement
Reste.ResultColorTest.cpp CMakeLists.txt Deux fichiers et ensuite utiliser
cmake . Régénérer ( J'en veux plus. cpp Modifier si les fichiers sont compilés ensemble CMakeLists.txt Le contenu de )

csdn1 Téléchargements de volume (C'est drôle.)

版权声明
本文为[Les programmeurs ont évolué sans perte de cheveux!]所创,转载请带上原文链接,感谢
https://cdmana.com/2022/01/202201080602068771.html

Scroll to Top