2010-10-23 4 views
1

J'ai expérimenté avec rwlock sur Mac et j'éprouve quelque chose qui me semble ne devrait pas se produire. Il y a une étrange combinaison d'utilisation de verrous en lecture/écriture avec des verrous de lecture récursifs qui est un blocage, mais cela ne devrait pas être le cas. J'ai posté le code sur pastebin parce que c'est plus qu'un simple extrait de code. La façon dont ce code est écrit ne devrait pas être bloquée, et ne l'est en effet pas sous Linux. Pourquoi cette impasse sur un mac?Pthread RWLock sur MAC Deadlocking mais pas sur Linux?

http://pastebin.com/Ui9iS1ke

Toutes les idées?

+0

Combien de noyaux les deux machines ont-elles? –

+0

le mac a deux cœurs, la machine linux a 3 cœurs. –

+0

Copie possible de [Verrouillage RWLock RWLock avec verrous récursifs] (http://stackoverflow.com/questions/3984276/pthread-rwlock-deadlocking-with-recursive-locks) – zondo

Répondre

0

Aaron: Je viens de croiser cela. J'ai trouvé que l'on peut contourner ce problème en utilisant le stockage local de threads. Créer une enveloppe autour de la rwlock qui incrémente un fil clé locale:

@interface ReadWriteLock : NSObject { 
    pthread_key_t readKey; 
    pthread_key_t writeKey; 
    pthread_rwlock_t rwLock; 
} 

-(void)lockRead; 
-(void)unlockRead; 

-(void)lockWrite; 
-(void)unlockWrite; 

@end 

incrémenter Puis le readkey en utilisant pthread_setspecific lorsque vous appelez lockRead, décrémenter quand vous appelez unlockRead, seulement rd_lock lorsque la clé passe de 0 à 1 et seulement rw_unlock lorsque la clé passe de 1 à 0. Copiez ceci pour la logique writeLock.

Étant donné que pthread_setspecific et pthread_getspecific sont locaux, vous n'avez pas besoin de verrouiller l'accès à ceux-ci. Veillez à appeler les fonctions de création/initialisation pthread appropriées dans init et assurez-vous de disposer de tous les membres pthread_ * dans dealloc.

Malheureusement, je ne peux pas vous donner la source complète de ma solution, mais la méthode ci-dessus fonctionne (je l'ai testé fortement).

+0

J'ai également créé un wrapper c autour de rwlocks pour cette situation. – gngrwzrd

+0

https://github.com/beheadedmyway/gwlib/blob/master/src/gwpth.c – gngrwzrd

Questions connexes