Par nature un "thread-safe" de la fonction, et est en sécurité sans avoir à prendre de conception spécifique, les décisions concernant le filetage, il est thread-safe, tout simplement en raison de la tâche qu'il effectue plutôt que d'être repensé à la force de sécurité des threads. Dis-je écrire la fonction très simple:
int cube(int x)
{
return x*x*x;
}
Il est intrinsèquement thread-safe, comme il n'a aucun moyen de lecture ou écriture à la mémoire partagée. Cependant je pourrais aussi faire une fonction qui n'est pas thread-safe, mais en faire thread-safe par le biais de la conception et de la synchronisation. Dire que j'ai cette fonction similaire à avant:
void cubeshare()
{
static int x;
x = x * x * x;
printf("%l", x);
}
Ce n'est pas thread-safe, il est tout à fait possible, il pourrait avoir la valeur de x change entre chaque utilisation (eh bien, ce est en fait peu probable dans la réalité que x serait mise en cache, mais disons que nous n'en faisons pas toute optimisation).
Nous avons cependant pu faire de ce "thread-safe" comme ceci (c'est le pseudo-code, un vrai mutex est plus compliqué):
void cubesharesafe(mutex foo)
{
static int x;
lockmutex(foo);
x = x * x * x;
printf("%l", x);
unlockmutex(foo);
}
Toutefois, ce n'est pas, en soi, thread-safe, nous obligent à être par une refonte. Des exemples concrets seront souvent beaucoup plus compliqué que cela, mais j'espère que cela donne une idée pris le plus simple possible. Si vous avez des questions, s'il vous plaît commentaire ci-dessous.