076-使用通信的方式共享内存

Posted --Allen--

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了076-使用通信的方式共享内存相关的知识,希望对你有一定的参考价值。

希望你还能记得住这句话:

“不要使用共享数据的方式进行通信,而应该使用通信的方式来共享数据。”

这一节,我们秉承这一理念,来改写前面的银行账户存款问题。

1. 思路

  • 使用 channel 对控制共享数据。
  • 不要将共享数据暴露出去。

其实第二条就可以使用第一条来实现。我们使用一个函数来维护这个共享数据。假设该函数叫 monitor.

完整的程序如下:

// gopl/sync/transaction/bank_monitor/bank.go

package bank

var deposits = make(chan int)
var balances = make(chan int)

// monitor 管理 balance 变量
func monitor() 
    var balance int

    // 使用 channel 控制对共享数据的访问
    for 
        select 
        case amount := <-deposits:
            balance += amount
        case balances <- balance:
        
    



func Deposit(amount int) 
    deposits <- amount


func Balance() int 
    return <-balances


// 这是一个永远不会停止的 goroutine
func init() 
    go monitor()

上面的 monitor 函数被称之为监控函数,而 go monitor() 则是监控 goroutine.

2. 总结

  • 掌握如何使用通信的方法来共享数据

以上是关于076-使用通信的方式共享内存的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信的六大方式

Linux进程间通信—使用共享内存

以通信方式共享内存,不要以共享内存方式通信

Linux进程间通信——使用共享内存

进程间通信方式——共享内存

Android进程间通信之共享内存的使用