Static, Global et Thread

Programmation d'applications complexes
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Static, Global et Thread

Message par LeCyb »

D'abord merci à Dri pour le coup de pouce sur les interfaces, j'ai à peu près capté le machin :)

Donc ici j'ai ceci:

Code : Tout sélectionner

; on déclare les fonctions de notre objet dans une Interface
Interface Math_Interface
  SetX(x)
  SetY(y)
  Add()
  Free()
EndInterface

; on déclare une structure pour y stocker les adresses des procédures
Structure Math_Virtual
  SetX.l
  SetY.l
  Add.l
  Free.l
EndStructure

; on déclare la structure "interne" de l'objet
Structure Math_Object
  *Virtual.Math_Virtual
  x.l
  y.l
EndStructure

; nos procédures
Procedure SetX(*Object.Math_Object, x)
  *Object\x = x
EndProcedure
 
Procedure SetY(*Object.Math_Object, y)
  *Object\y = y
EndProcedure
 
Procedure Add(*Object.Math_Object)
  ProcedureReturn *Object\x + *Object\y
EndProcedure

Procedure Free(*Object.Math_Object)
  FreeMemory(*Object)
EndProcedure

; ici on déclare une variable globale contenant les adresses des procédures
Global  Math_Global.Math_Virtual
Math_Global\SetX = @SetX()
Math_Global\SetY = @SetY()
Math_Global\Add = @Add()
Math_Global\Free = @Free()

; une procédure d'initialisation qui permet de "créer" un nouvel objet en mémoire, on retourne le pointeur de cet objet
Procedure.l NewMath_Object()
  *new.Math_Object = AllocateMemory(SizeOf(Math_Object))
  *new\Virtual = Math_Global
  ProcedureReturn *new
EndProcedure

; création d'un nouvel objet dans le programme
MonMath.Math_Interface = NewMath_Object()

; utilisation des procédures de l'objet
MonMath\SetX(5)
MonMath\SetY(2)
Debug = MonMath\Add()

; on détruit l'objet
MonMath\Free()
Comme on peut le constater y'a un Global où sont stockés des adresses des procédures. Dans le constructeur on assigne au nouvel objet la table virtuelle avec ce Global.

J'ai essayé de faire une "simple" variable dans la procédure (donc pas globale) et de l'assigner mais ça plante.
Dri m'a proposé de faire une variable statique dans la procédure et cela fonctionne.

Code : Tout sélectionner

...
Procedure.l NewMath_Object()
  Static Math_Global.Math_Virtual
  Math_Global\SetX = @SetX()
  Math_Global\SetY = @SetY()
  Math_Global\Add = @Add()
  Math_Global\Free = @Free()
  *new.Math_Object = AllocateMemory(SizeOf(Math_Object))
  *new\Virtual = Math_Global
  ProcedureReturn *new
EndProcedure
...
Mon soucis est de savoir si le Global et/ou le Static peuvent poser des problèmes si on utilise l'objet dans des threads.

Si oui, comment détourner la chose pour avoir un objet qui résiste au threads ?
Vive le thread-safe !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

tu peux allouer une virtualtable pour chaque objet, ca je te l'ai déjà dit mais là j'ai plutot une question à te poser.

dans un (multi) thread les seuls risques qui existent sont l'écriture simultanée et la réentrace. un simple acces en lecture (on ne modifie pas la virtual table une fois créée=) pose-t-il vraiment probleme ?

Dri
LeCyb
Messages : 273
Inscription : dim. 26/déc./2004 20:49

Message par LeCyb »

C'est ce que j'ai conclus, si je ne fais que de la lecture ça ne devrait pas poser de problème avec le global.

Mais ça reste légèrement ennuyant car je compte faire une librairie et donc y'aura un global qui se ballade et qu'on risque d'oublier mais je pense que j'arriverai à vivre avec :D
Vive le thread-safe !
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message par nico »

Si t'en fais une Lib statique, tu n'auras aucun problème avec ce global; il ne sera visible que pour la lib.
Répondre