So I've tried one method that locks each node as it looks at it, but this requires ALOT of locking and unlocking... which of course requires quite a bit of overhead. I was wondering if anyone knew of a more efficient algorithm. Here is my first attempt:
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); } }