【发布时间】:2011-09-21 13:52:52
【问题描述】:
我注意到当我有一个锁定和解锁线程的算法时,我的性能受到了很大的影响。
有什么办法可以帮助解决这个开销?使用信号量会提高/降低效率吗?
谢谢
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);
}
}
【问题讨论】:
-
信号量做不同的(更复杂的)事情,而且很可能更慢。你的操作系统是什么?你能把锁做得更细,这样你就不会阻塞那么久吗?
-
或者让它们更粗粒度/每次锁定做更多的工作,所以你不会得到这么多的上下文切换。有一个很好的平衡。
-
如果您展示/描述我们可能会给出提示的算法。解决方案应该是:使用更少的锁定(在专用核心上划分工作,因此您不需要锁定子区域)或使其无锁(haaaaaaaard)。除了摩尔定律,别无他法
-
某些算法本质上比其他算法更连续。但是锁定和限制访问以获得正确的结果比不锁定并更快地获得错误的结果要好。
-
@nos - 好点,谢谢。一条黄金法则:如果可以的话,不要锁定网络或文件 I/O 等长时间运行的操作。