Голанг блокирует читателей только тогда, когда писатель вносит изменения - PullRequest
0 голосов
/ 16 мая 2018

У меня одна программа-писатель и несколько программ-читателей. Я хочу заблокировать читателей, когда писатель меняет данные.

package main

data []int

func main() {
    m := sync.Mutex{}

    for i := 0; i< 10; i++ {
        go func reader() {
            for {
                m.Lock()
                myData := data
                m.Unlock()
                read_from_data(myData)
            }
        }()
    }

    go func writer() {
        for {
            newData := new_data()
            m.Lock()
            data = newData
            m.Unlock()
            time.Sleep(1 * time.Seconds)
        }
    }
}

Как я могу это сделать, чтобы читатели не блокировали друг друга?

1 Ответ

0 голосов
/ 16 мая 2018

Это то, для чего sync.RWMutex.

Имеется 2 различных метода блокировки: RWMutex.Lock() для писателей и RWMutex.RLock() для читателей.(И есть 2 различных метода разблокировки, соответствующих различным методам блокировки: RWMutex.Unlock() и RWMutex.RUnlock().)

RWMutex позволяет использовать несколько считывателей, или1 писательЕсли писатель получил блокировку, никакие читатели не допускаются до тех пор, пока писатель не разблокируется (также никакие другие писатели не допускаются).Если читатель получает блокировку на чтение, любые другие читатели разрешены (но не писатель, пока все читатели не разблокируются).

m := sync.RWMutex{}

for i := 0; i < 10; i++ {
    go func() { // reader
        for {
            m.RLock()
            myData := data
            m.RUnlock()
            read_from_data(myData)
        }
    }()
}

go func() { // writer
    for {
        newData := new_data()
        m.Lock()
        data = newData
        m.Unlock()
        time.Sleep(1 * time.Seconds)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...