gpt4 book ai didi

c++ - pthread_mutex_lock/unlock 的性能

转载 作者:可可西里 更新时间:2023-11-01 16:25:30 27 4
gpt4 key购买 nike

我注意到,当我有一个可以大量锁定和解锁线程的算法时,我的性能会受到相当大的影响。

有什么办法可以帮助减少开销吗?使用信号量会提高/降低效率吗?

谢谢

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);
}
}

最佳答案

与其担心草叶,不如退后一步,观察整片森林。

任何依赖于两个线程的算法都可能紧密地踩在彼此的脚趾上,本质上是低效的。尝试找到一种方法来大幅减少交互需求。

例如,如果一个线程产生数据而另一个线程使用它,那么很容易想到一种低效的算法,即生产者将数据发布到共享内存中,然后等待另一个线程使用它。与此同时,消费者正在等待生产者完成,等等。生产者写入文件或管道,消费者从中读取,这一切都大大简化了。

关于c++ - pthread_mutex_lock/unlock 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6460542/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com