Dans une base de code que j'ai examiné, j'ai trouvé la marche suivante.
void notify(struct actor_t act) {
write(act.pipe, "M", 1);
}
// thread A sending data to thread B
void send(byte *data) {
global.data = data;
notify(threadB);
}
// in thread B event loop
read(this.sock, &cmd, 1);
switch (cmd) {
case 'M': use_data(global.data);break;
...
}
"Hold on", je l'ai dit à l'auteur, un haut membre de mon équipe, "il n'y a pas de barrière de mémoire ici! Vous n'avez pas de garantie que l' global.data
seront supprimées du cache mémoire principale. Si Un thread et le fil B sera exécuté en deux processeurs différents - ce système peut échouer".
Le programmeur senior lui sourit et expliqua lentement, comme si l'explication de ses cinq ans garçon comment attacher ses lacets: "écoutez jeune garçon, nous l'avons vu ici beaucoup de fil bugs, en haut de test de charge, et dans la vraie clients", il s'arrêta à gratter ses longs poils de barbe, "mais nous n'avons jamais eu de bug avec cet idiome".
"mais, il est dit dans le livre..."
"assez!", il feutrée moi promptement,
"peut-être, théoriquement, il n'est pas garanti, dans la pratique, le fait que vous avez utilisé un appel de fonction est effectivement une barrière de mémoire, le compilateur ne va pas réorganiser l'instruction global.data = data
, car il ne peut pas savoir si quelqu'un de l'utiliser dans l'appel de fonction, et l'architecture x86 veillera à ce que les autres Processeurs va voir ce morceau de données globales par le temps thread B lit la commande à partir de la pipe. Soyez rassurés, nous avons assez de problèmes du monde réel d'inquiétude, nous n'avons pas besoin d'investir des efforts supplémentaires dans de faux problèmes théoriques.
Soyez rassurés, mon garçon, dans le temps, vous comprendrez de séparer le vrai problème de la je-besoin-pour-obtenir-un-Doctorat non des problèmes."
Est-il correct? est-ce vraiment un problème dans la pratique (dire x86, x64 et ARM)?
C'est contre tout ce que j'ai appris, mais il a une longue barbe et un très joli look!
Des points supplémentaires si vous pouvez me montrer un bout de code prouver qu'il se trompait!