【发布时间】:2020-05-03 13:57:17
【问题描述】:
我现在大二学习操作系统。 我想通过实现二叉搜索树和使用互斥锁来比较细粒度和粗粒度。 锁定和解锁用于节点插入和删除功能,并打印执行时间。 我认为细粒度会更快。但是,即使我更改数字,粗粒度也会更快。 有没有人可以解释一下?我写错代码了吗?
int lab2_node_insert_fg(lab2_tree *tree, lab2_node *new_node){
if (tree->root == NULL) {
tree->root = new_node;
return LAB2_ERROR;
}
if (search_key(tree,new_node->key)) {
return LAB2_ERROR;
}
lab2_node* cur = tree->root;
while (1) {
if (cur->key < new_node->key) {
if (cur->right == NULL) {
pthread_mutex_lock(&lock); // LOCK
cur->right = new_node;
pthread_mutex_unlock(&lock); // UNLOCK
return LAB2_SUCCESS;
}
cur = cur->right;
}
else {
if (cur->left == NULL) {
pthread_mutex_lock(&lock); // LOCK
cur->left = new_node;
pthread_mutex_unlock(&lock); // UNLOCK
return LAB2_SUCCESS;
}
cur = cur->left;
}
}
}
int lab2_node_insert_cg(lab2_tree *tree, lab2_node *new_node){
pthread_mutex_lock(&lock); // LOCK
if (tree->root == NULL) {
tree->root = new_node;
pthread_mutex_unlock(&lock); // UNLOCK
return LAB2_ERROR;
}
if (search_key(tree,new_node->key)) {
pthread_mutex_unlock(&lock); // UNLOCK
return LAB2_ERROR;
}
lab2_node* cur = tree->root;
while (1) {
if (cur->key < new_node->key) {
if (cur->right == NULL) {
cur->right = new_node;
pthread_mutex_unlock(&lock); // UNLOCK
return LAB2_SUCCESS;
}
cur = cur->right;
}
else {
if (cur->left == NULL) {
cur->left = new_node;
pthread_mutex_unlock(&lock); // UNLOCK
return LAB2_SUCCESS;
}
cur = cur->left;
}
}
}
【问题讨论】:
-
不看代码说不出口。细粒度允许更多的并发性,但具有更高的开销。权衡是否有意义完全取决于您的工作量。
-
我将在这里添加我的代码!
-
一个 sn-p 如何比另一个更细粒度?它们似乎都只使用一个全局(或每棵树)锁。
-
我一定是误会了。我刚刚意识到两者都使用一个锁。非常感谢您的建议!
标签: locking binary-search-tree mutex