Je suis à la recherche d'un verrou d'écriture en lecture évolutif pour win32 avec le comportement de pthreads rwlock, où un verrou de lecture peut être mis à jour et déclassé.Verrou de lecture/écriture évolutif Win32
Ce que je veux:
pthread_rwlock_rdlock(&lock);
...read...
if(some condition) {
pthread_rwlock_wrlock(&lock);
...write...
pthread_rwlock_unlock(&lock);
}
...read...
pthread_rwlock_unlock(&lock);
Le comportement de mise à niveau ne l'exige pas posix, mais il fonctionne sur linux sur mac.
Actuellement, j'ai une implémentation fonctionnelle (basée sur un événement, un sémaphore et une section critique) qui est extensible, mais la mise à niveau peut échouer lorsque les lecteurs sont actifs. Si cela échoue, un verrouillage de lecture + revérification + verrouillage d'écriture est nécessaire.
Ce que j'ai:
lock.rdlock();
...read...
if(some condition) {
if(lock.tryupgrade()) {
...write...
lock.unlock();
return;
} else {
lock.unlock();
// <- here, other threads may alter the condition ->
lock.wrlock();
if(some condition) { // so, re-check required
...write...
}
lock.unlock();
return;
}
}
...read...
lock.unlock();
EDIT: La prime:
Je suis toujours à la recherche, mais que vous voulez ajouter quelques restrictions: il est utilisé intra-processus uniquement (donc à base sur les sections critiques est ok, les mutex WIN32 ne sont pas ok), et il devrait être pure API WIN32 (pas de MFC, ATL etc.). L'acquisition de verrous de lecture doit être rapide (ainsi, l'acquisition du verrou de lecture ne doit pas entrer dans une section critique de son chemin rapide). Peut-être qu'une solution basée sur InterlockedIncrement est-elle possible?
L'implémentation win32 de 'boost :: shared_mutex' semble prometteuse. L'implémentation de pthread n'est pas très jolie (elle a plus que ce dont j'ai besoin, et donc la méthode qu'ils utilisent n'est peut-être pas aussi efficace que pthread_rwlock_ avec le comportement de mise à niveau non standard ..). Je vais essayer ... – Frunsi
Eh bien, c'est parfait, et après avoir lu la documentation et essayé, tout est logique maintenant :-) – Frunsi