La Performance de pthread_mutex_lock/déverrouiller

J'ai remarqué que je prends un assez grand rendement frappé, quand j'ai un algorithme qui se verrouille et se déverrouille d'un thread BEAUCOUP.

Est-il un moyen pour aider à cette surcharge de travail? En utilisant un sémaphore être plus ou moins efficace?

Grâce

typedef struct _treenode{
struct _treenode *leftNode;
struct _treenode *rightNode;
int32_t data;
pthread_mutex_t mutex;
}TreeNode;
pthread_mutex_t _initMutex = PTHREAD_MUTEX_INITIALIZER;
int32_t insertNode(TreeNode **_trunk, int32_t data){
TreeNode **current;
pthread_mutex_t *parentMutex = NULL, *currentMutex = &_initMutex;
if(_trunk != NULL){
current = _trunk;
while(*current != NULL){
pthread_mutex_lock(&(*current)->mutex);
currentMutex = &(*current)->mutex;
if((*current)->data < data){
if(parentMutex != NULL)
pthread_mutex_unlock(parentMutex);
pthreadMutex = currentMutex;
current = &(*current)->rightNode;
}else if((*current)->data > data){
if(parentMutex != NULL)
pthread_mutex_unlock(parentMutex);
parentMutex = currentMutex;
current = &(*current)->leftNode;
}else{
pthread_mutex_unlock(currentMutex);
if(parentMutex != NULL)
pthread_mutex_unlock(parentMutex);
return 0;
}
}
*current = malloc(sizeof(TreeNode));
pthread_mutex_init(&(*current)->mutex, NULL);
pthread_mutex_lock(&(*current)->mutex);
(*current)->leftNode = NULL;
(*current)->rightNode = NULL;
(*current)->data = data;
pthread_mutex_unlock(&(*current)->mutex);
pthread_mutex_unlock(currentMutex);
}else{
return 1;
}
return 0;
}
int main(){
int i;
TreeNode *trunk = NULL;
for(i=0; i<1000000; i++){
insertNode(&trunk, rand() % 50000);
}
}
Un sémaphore ne différent (plus complexe) des choses et il est plus probable plus lent. Quel est ton OS? Pouvez-vous faire de la serrure plus fine-grain afin de ne pas bloquer aussi longtemps?
Ou de les rendre plus à grain grossier/faire plus de travail par verrouillage, de sorte que vous n'avez pas de changements de contexte. Il y a un bel équilibre.
Si vous afficher/décrire l'algorithme que nous pourrions donner des conseils. La solution: utiliser moins de verrouillage (répartir le travail sur des cœurs, de sorte que vous n'avez pas besoin de verrouiller les sous-régions) ou de le rendre lockfree (haaaaaaard). Rien d'autre, mais Moores Loi va aider
Certains algorithmes sont intrinsèquement série plus que d'autres. Mais de verrouillage et de limiter l'accès pour obtenir un résultat correct est mieux que pas de verrouillage et d'obtenir un résultat incorrect plus rapide.
bon point, merci pour ça. Une règle d'or: ne pas verrouiller l'échelle longue ops comme réseau ou d'un fichier I/O si vous pouvez l'aider.

OriginalL'auteur poy | 2011-06-23