2009-12-04 10 views
4

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?

Répondre

2

La classe shared_mutex boost prend en charge les verrous de lecteur (partagé) et d'écriture (unique) et les mises à niveau temporaires de verrous partagés vers des verrous uniques.

Example for boost shared_mutex (multiple reads/one write)?

Je ne recommande pas d'écrire votre propre, il est une chose difficile à obtenir le droit et difficile à tester à fond.

+0

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

+0

Eh bien, c'est parfait, et après avoir lu la documentation et essayé, tout est logique maintenant :-) – Frunsi

0

La bibliothèque pthread est une bibliothèque 'Portable Threads'. Cela signifie qu'il est également pris en charge sur les fenêtres;) Jetez un oeil: Pthreads-w32.

En outre, pensez à utiliser OpenMP au lieu de verrous: l'extension du compilateur fournit portable sections critiques, le modèle de threads Kernes, les tâches et bien plus encore! MS C++ supporte cette technologie ainsi que g ++ sous Linux.

À la votre! :)

+1

En fait, pthread signifie un thread POSIX. Windows peut être compatible POSIX si vous téléchargez les services nécessaires –

+0

Vous avez raison, mais ils sont souvent appelés "Portable" parce qu'ils le sont. :) – kolypto