Me he dado cuenta de que recibo un gran golpe de rendimiento cuando tengo un algoritmo que bloquea y desbloquea un subproceso ALOT.Rendimiento de pthread_mutex_lock/unlock
¿Hay alguna manera de ayudar a esta sobrecarga? ¿Sería el uso de un semáforo más o menos eficiente?
Gracias
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 semáforo hace cosas diferentes (más complejas) y es más probable que sea más lento. ¿Cuál es tu sistema operativo? ¿Puedes hacer que la cerradura sea más fina para que no bloquees durante tanto tiempo? –
O hágalos de grano más grueso/haga más trabajo por bloqueo, para que no tenga tantos cambios de contexto. Hay un buen equilibrio. – nos
Si muestra/describe el algoritmo, podemos dar pistas. La solución debería ser: utilizar menos bloqueo (dividir el trabajo en núcleos dedicados, por lo que no es necesario bloquear las subregiones) o hacerlo sin bloqueo (haaaaaaard). Nada más que Moores Law va a ayudar – sehe