j'ai un morceau de code où j'ai quelque chose comme:programme s'écraser au hasard en raison d'appel gratuit() dans plusieurs threads
int *mem_ptr;
.
.
if(mem_ptr)
{
free(mem_ptr);
}
.
.
L'application est multi-thread. Parfois, ce qui se passe est un thread passe le if
vérifier et puis avant le changement de contexte free()
se produit et un autre thread passe également le if
vérifier et également le free()
. Maintenant, lorsque le contrôle revient au premier thread il se bloque à free()
donnant l'erreur Abort message: 'invalid address or address of corrupt block 0x40735cb0 passed to dlfree'
.
Autre que mutex, est-il une meilleure façon de gérer cette situation
PS: Je travaille sur Android classeurs natifs en C++ et ce morceau de code est dans l'appel onTransact()
.
Tu ne peux pas utiliser shared_ptr? Si ce n'est pas le cas, la mise en œuvre d'un mécanisme compté par ref utilisant des incréments et des décréments atomiques en valait la peine. – Arunmu
Arunmu a raison - votre logique est intrinsèquement brisée non seulement à cause des multiples possibles, mais aussi parce qu'un thread peut libérer le point-to-memory alors qu'un autre thread continue à l'utiliser (ne l'ayant pas encore fait). La réponse de Jeegar à propos de la création de l'atomique 'free (mem_ptr)' n'est pas suffisante pour obtenir du code fiable. –
Assurez-vous que le mem est alloué via malloc – David