// Wake other threads waiting for usif(_waiting)futex_wake((void*)&_waiting);
Ce n'est pas comme ça que les futex fonctionnent, il faut mettre à jour la valeur de _waiting.
Par exemple, il y a une race condition si le code de réveil est exécuter là ou il y a le ici.
Lis ce document si ce n'est déjà fait: http://www.akkadia.org/drepper/futex.pdf
Quand tu fait un ftruncate pour agrandir ton fichier, tu dois refaire unmmap pour que les nouvelles pages
soit prises en compte. Bonne chance pour faire ça de façon lockfree.
Je vois aussi que tu utilise le mot clé volatile de temps en temps. Volatile ne doit pas être
utiliser pour la communication entre threads.
Enfin tu dis que tu utilise C++03, mais C++03 ne permet pas de faire de la programmation multi-thread.
En effet: le standard ne mentionne pas les thread et la concurrence.
Ce n'est que à partir de C++11 qui introduit un modèle de mémoire qui fonctionne avec des thread.
Et donc tu peux utiliser std::mutex et std::atomique, ça rends le code plus lisible et portable.
# Lock-free: Encore beaucoup à apprendre.
Posté par Gof (site web personnel) . En réponse au journal S'essayer à la production scientifique. Évalué à 10.
Quand tu as des futex_wait ou des pthread_mutex ta structure de donnée n'est pas lock-free
Lock-free veux dire sans aucun lock.
Aussi, il y a des erreurs:
Et
Ce n'est pas comme ça que les futex fonctionnent, il faut mettre à jour la valeur de _waiting.
Par exemple, il y a une race condition si le code de réveil est exécuter là ou il y a le
ici.Lis ce document si ce n'est déjà fait: http://www.akkadia.org/drepper/futex.pdf
Quand tu fait un
ftruncatepour agrandir ton fichier, tu dois refaire unmmappour que les nouvelles pagessoit prises en compte. Bonne chance pour faire ça de façon lockfree.
Je vois aussi que tu utilise le mot clé
volatilede temps en temps. Volatile ne doit pas êtreutiliser pour la communication entre threads.
Enfin tu dis que tu utilise C++03, mais C++03 ne permet pas de faire de la programmation multi-thread.
En effet: le standard ne mentionne pas les thread et la concurrence.
Ce n'est que à partir de C++11 qui introduit un modèle de mémoire qui fonctionne avec des thread.
Et donc tu peux utiliser std::mutex et std::atomique, ça rends le code plus lisible et portable.