Bonjour,
dans l'exemple Lazarus/version/examples/multithreading/waitforexample1 je trouve la procédure suivante :
1 2 3 4 5 6 7 8 9 10 11 12
| procedure TThreadA.Execute;
begin
Form1.ThreadB := TThreadB.Create(false);
// create event
WaitForB := RTLEventCreate;
while not Application.Terminated do begin
Log('A: wait for B ...');
// wait infinitely (until B wakes A)
RtlEventWaitFor(WaitForB);
Log('A: ThreadB.Counter=' + IntToStr(Form1.ThreadB.Counter));
end;
end; |
Regardez bien la 1re ligne, je la remets toute seule :
Form1.ThreadB := TThreadB.Create(false);
et si je pose la question, c'est parce que nulle part dans le code je n'ai trouvé de destruction de ce ThreadB.
Est-ce à dire que si je fais tourner le programme un certain temps, ça va consommer toute la mémoire disponible jusqu'au crash de la machine ?
Quant à la ligne suivante, WaitForB := RTLEventCreate;, j'ai jeté un coup d'œil à l'aide et ça donne ça :

Envoyé par
aide Lazarus
RTLEventCreate creates and initializes a new RTL event. RTL events are used to notify other threads that a certain condition is met, and to notify other threads of condition changes (conditional variables).
The function returns an initialized RTL event, which must be disposed of with RTLEventdestroy.
et nulle part dans le code je ne trouve d'appel à RTLEventdestroy.
Qu'est-ce que les spécialistes des threads en pensent ?
Et enfin juste pour rire, quand on fait des manips tordues avec les threads, des fois l'exécutable ne répond plus et il faut le tuer, le pauvre, en cliquant sur la croix, mais il se défend par un dernier message :

Le gag c'est ce qui arrive après la validation :

Et cette information est confirmée par l'utilisation de l'outil locate (sous Linux, que du bonheur), qui ne trouve rien :
1 2
| $ locate futex-internal.h
$ (vide) |
Au plaisir de vous lire...
Partager