Si vous voulez quelque chose de "portable" dans le sens de se conformer à certaines normes ... Si vous utilisez des threads POSIX il y a pthread_rwlock_init()
et amis. Ceux-ci ne sont bien sûr pas typiquement utilisés sur Windows mais plutôt sur les OS de type Unix. Mais si vous voulez dire "portable" dans le sens de "portable vers plusieurs versions de Windows ..." Il y a des appels non documentés dans ntdll
qui implémentent des verrous RW. RtlAcquireResourceShared()
et RtlAcquireResourceExclusive()
.
Voici quelques prototypes de WINE's implementation:
void WINAPI RtlInitializeResource(LPRTL_RWLOCK rwl);
void WINAPI RtlDeleteResource(LPRTL_RWLOCK rwl);
BYTE WINAPI RtlAcquireResourceExclusive(LPRTL_RWLOCK rwl, BYTE fWait);
BYTE WINAPI RtlAcquireResourceShared(LPRTL_RWLOCK rwl, BYTE fWait);
void WINAPI RtlReleaseResource(LPRTL_RWLOCK rwl);
Remarque vous pouvez avoir à GetProcAddress()
ceux-ci de ntdll.dll
vous.
En ce qui concerne la structure référencée ... Voici ce que déclare VIN:
typedef struct _RTL_RWLOCK {
RTL_CRITICAL_SECTION rtlCS;
HANDLE hSharedReleaseSemaphore;
UINT uSharedWaiters;
HANDLE hExclusiveReleaseSemaphore;
UINT uExclusiveWaiters;
INT iNumberActive;
HANDLE hOwningThreadId;
DWORD dwTimeoutBoost;
PVOID pDebugInfo;
} RTL_RWLOCK, *LPRTL_RWLOCK;
Si vous ne voulez pas utiliser pthreads et vous ne voulez pas faire un lien vers une fonctionnalité non documentée ... Vous pouvez peu précis Recherchez une implémentation de rwlock et mettez-la en œuvre vous-même en termes d'autres opérations ... Dites InterlockedCompareExchange()
, ou peut-être des primitives de niveau supérieur telles que des sémaphores et des événements.
Eh bien, je ne veux pas d'appels système et ce n'est pas le code pour SRW. Ils sont rapides. Tout ce que je veux, c'est du code C/Assembler qui est en train de faire cette magie InterlockedCompareExchange. Cela devrait être par définition portable sur les plates-formes Intel i386 ou amd64 si la même syntaxe d'assembleur est utilisée. – Lothar
Dans ce cas: http://www.google.com/search?q=rwlock+interlockedcompareexchange - Notez également que l'instruction x86 pour InterlockedCompareExchange() est "lock cmpxchg". – asveikau
@Lothar - eh bien vous ne pouvez pas complètement éviter les appels système si vous voulez un blocage correct - c'est-à-dire, quand un thread ne peut pas acquérir le verrou, il doit aller se mettre en veille. L'appel système ne se produit que dans le cas contentieux - si vous ne voulez pas d'appel système, la seule option est de faire tourner la boucle, à peu près. J'ai ajouté une réponse ci-dessous qui décrit comment vous rouleriez le vôtre. – BeeOnRope