返回顶部
首页 > 资讯 > 后端开发 > GO >如何在使用指针变量时消除数据竞争
  • 420
分享到

如何在使用指针变量时消除数据竞争

2024-04-04 23:04:28 420人浏览 安东尼
摘要

小伙伴们对golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《如何在使用指针变量时消除数据竞争》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望

小伙伴们对golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《如何在使用指针变量时消除数据竞争》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

这里有一些起始代码,

func (chm *concurrentHashMap) nfetchworker() {
    for {
        key := <-nfetchworkerpipe
        chm.mu.rlock()
        data := chm.data[string(key)]
        chm.mu.runlock()
        if data.isusingnfetch {
            chm.mu.lock()
            *(chm.data[string(key)].nfetch)--
            chm.mu.unlock()
        }
    }
}

Go nfetchworker()

struct concurrenthashmap 看起来像这样,

type concurrenthashmap struct {
    data map[string]datablock
    mu sync.rwmutex
}

结构 datablock 看起来像这样,

type datablock struct {
    ...
    nfetch        *int32
    isusingnfetch bool
    ...
}

现在,当我尝试在启用竞赛标志的情况下运行测试时。我明白了,

write at 0x00c00012e310 by goroutine 8:
  (*concurrenthashmap).nfetchworker()

行号指向该行。

*(chm.data[string(key)].nfetch)--

但是,当我不在 datablock.nfetch 中使用指针时,我不会遇到此问题。 但如果我这样做,我就失去了直接从映射对 nfetch 进行更改的能力,而无需将一个全新的结构对象重新分配给映射中的哈希值,这在计算上相对昂贵。我想更改 nfetch 的值,而无需为一个小更改再次重新分配整个结构,同时不受数据争用的影响。有什么解决办法吗??

对 golang 相当陌生,我可能在这里做了一些非常愚蠢的事情,请随意指出。

更新:添加读写操作功能

func (chm *concurrenthashmap) get(key key) value {
    chm.mu.rlock()
    fetch, ok := chm.data[string(key)]
    chm.mu.runlock()
    if ok {
        if checkvaluevalidity(&fetch) {
            nfetchworkerpipe <- key
            return fetch.value
        } else {
            chm.mu.lock()
            delete(chm.data, string(key))
            chm.mu.unlock()
        }
    }

    return constants.nil
}

写操作

func (chm *ConcurrentHashMap) Insert(key Key, value Value, options Options) {
    ...
    chm.mu.Lock()
    chm.data[string(key)] = Block{
        Value:         value,
        NFetch:        nFetchOld,
        Expiry:        time.Now().Add(delay),
        IsUsingNFetch: foundNFetch,
        IsUsingExpiry: foundTTL,
        mu:            mutex,
    }
    chm.mu.Unlock()
}


正确答案


问题出在 checkvaluevalidity 中,您在其中访问 nfetch 而不定它。永远不要在没有锁定指针的情况下访问指针。

func checkvaluevalidity(value *block) bool {
    if value.isusingexpiry && !value.expiry.after(time.now()) {
        return false
    }

    if value.isusingnfetch && *(value.nfetch) <= 0 {
        return false
    }

    return true
}

这段代码应该可以工作

func (chm *ConcurrentHashMap) Get(key Key) Value {
    chm.mu.RLock()
    fetch, ok := chm.data[string(key)]
    isValid := CheckValueValidity(&fetch)
    chm.mu.RUnlock()
    if ok {
        if isValid {
            NFetchWorkerPipe <- key
            return fetch.Value
        } else {
            chm.mu.Lock()
            delete(chm.data, string(key))
            chm.mu.Unlock()
        }
    }

    return constants.NIL
}

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注编程网公众号,一起学习编程~

您可能感兴趣的文档:

--结束END--

本文标题: 如何在使用指针变量时消除数据竞争

本文链接: https://lsjlt.com/news/595943.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何在使用指针变量时消除数据竞争
    小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《如何在使用指针变量时消除数据竞争》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望...
    99+
    2024-04-04
  • Swift 中的 Actors 使用以及如何防止数据竞争
    文章目录 前言Actors 的基本原理Actor 是引用类型,但与类相比仍然有所不同 为什么会出现数据竞争如何防止数据竞争使用 async/await 访问数据防止不必要的暂停非隔离(nonisolated)访问为什么在使用 ...
    99+
    2023-08-17
    swift ios 开发语言 原力计划
  • 何时应该在 C++ 函数中使用指针参数
    c++++ 中使用指针参数的时机:修改函数外部定义的数据,使用指针间接访问和修改原始值。处理引用类型(如 std::string),避免复制和修改原始数据。优化效率,减少复制数据,提高对...
    99+
    2024-04-20
    c++ 指针参数
  • 如何在Golang中使用指针从C中的数组访问数据
    在Golang中,可以使用`unsafe.Pointer`类型来访问C中的数组数据。假设有以下C代码:```c#include vo...
    99+
    2023-09-16
    Golang
  • 如何在PHP中使用变量函数
    变量函数是指可以使用变量来调用函数的一种特殊语法。在PHP中,变量函数是非常有用的,因为它可以让我们更加灵活地使用函数。在本文中,我们将介绍如何在PHP中使用变量函数。定义变量函数在PHP中,变量函数的定义方式非常简单,只需要将要调用的函数...
    99+
    2023-05-18
    使用 PHP 变量函数
  • vue如何在style标签中使用变量(数据)详解
    目录在 style 中使用 data 变量那么如何在代码中使用style属性呢?总结参考资料 SFC CSS Features | Vue.js 在 style 中使用 data 变...
    99+
    2024-04-02
  • vue如何使用localStorage在界面刷新时清除数据
    本篇内容主要讲解“vue如何使用localStorage在界面刷新时清除数据”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue如何使用localStorage在界面刷新时清除数据”吧!vue中...
    99+
    2023-07-04
  • 如何在Python中使用静态变量在计数
    今天,在用Python写一个统计一个文件下有多少文件的小标本时,遇到了一个很棘手的问题。如何在Python中使用静态变量来计数。然后,就在网上一通查找,找的方法都是利用类的方法来实现静态变量。说实话没有看太懂,另外我想如果用类成员当做静态...
    99+
    2023-01-31
    变量 静态 如何在
  • 如何在SQLServer中创建和使用临时表变量
    在SQL Server中,可以使用DECLARE关键字来创建临时表变量,并使用SELECT INTO语句或INSERT IN...
    99+
    2024-04-02
  • C++ 函数继承详解:如何在继承中使用“基类指针”和“派生类指针”?
    在函数继承中,使用“基类指针”和“派生类指针”来理解继承机制:基类指针指向派生类对象时,执行向上转型,只访问基类成员。派生类指针指向基类对象时,执行向下转型(不安全),必须谨慎使用。 ...
    99+
    2024-05-01
    c++ 继承 编译错误
  • Flask如何使用全局变量传递数据
    这篇“Flask如何使用全局变量传递数据”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Fl...
    99+
    2024-04-02
  • vue如何使用watch监听指定数据的变化
    目录使用watch监听指定数据的变化vue watch监听多个值使用watch监听指定数据的变化  在vue中,可以使用watch属性来监听data中某个属性值的变化。 &...
    99+
    2024-04-02
  • python变量数据类型和运算符如何使用
    本篇内容介绍了“python变量数据类型和运算符如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 数据类型不同类型的变量可以进行的运...
    99+
    2023-07-06
  • Navicat在存储过程中如何使用变量和参数
    在Navicat中,存储过程可以使用变量和参数来增强灵活性和可重用性。以下是在Navicat中如何使用变量和参数的步骤: 定义变量...
    99+
    2024-05-10
    Navicat
  • 如何在PHP中使用实时数据类型?
    PHP是一种流行的编程语言,它在数据处理方面有许多功能。其中,实时数据类型是一种非常重要的数据类型,它可以帮助我们更好地处理和管理实时数据。本文将介绍如何在PHP中使用实时数据类型。 实时数据类型是PHP7中引入的一个新特性,它可以帮助我们...
    99+
    2023-06-29
    数据类型 实时 numy
  • 如何在Python中使用实时数据类型?
    Python 是一种非常流行的编程语言,因为它易于上手,语法简单易懂,还有大量的库和工具可供使用。在 Python 中,实时数据类型是一种非常重要的概念,它可以帮助我们处理和分析实时数据流。在本文中,我们将介绍如何在 Python 中使用实...
    99+
    2023-10-23
    对象 实时 数据类型
  • 使用for循环从go函数接收两个返回值时如何有效利用局部变量和临时变量?
    来到编程网的大家,相信都是编程学习爱好者,希望在这里学习Golang相关编程知识。下面本篇文章就来带大家聊聊《使用for循环从go函数接收两个返回值时如何有效利用局部变量和临时变量?》,介绍一下,希...
    99+
    2024-04-04
  • 如何使用SQL语句在MySQL中更新和删除数据?
    如何使用SQL语句在MySQL中更新和删除数据?在MySQL数据库中,更新和删除数据是非常常见的操作。通过使用SQL语句,我们可以方便地更新和删除表中的数据。本文将介绍如何使用SQL语句在MySQL中更新和删除数据,并提供具体的代码示例。更...
    99+
    2023-12-17
    MySQL SQL语句 更新删除数据
  • 如何使用NumPy在实时数据处理中发挥作用?
    NumPy是Python中最常用的科学计算库之一。它提供了一个强大的多维数组对象,以及许多用于操作这些数组的函数。NumPy的使用范围广泛,包括数据分析、机器学习、图像处理、信号处理等领域。在实时数据处理中,NumPy也可以发挥重要作用。...
    99+
    2023-06-06
    javascript numpy 实时
  • 如何在 Python 中使用 numpy 实现实时数据分析?
    Python 是一种非常强大的编程语言,而 numpy 则是 Python 中用于科学计算的一个强大的工具。numpy 提供了许多用于数值计算的功能和数据结构,因此它被广泛地用于实时数据分析。在本篇文章中,我们将介绍如何使用 numpy 在...
    99+
    2023-07-04
    编程算法 numy 实时
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作