本文整理匯總了Golang中sync.RWMutex.RLock方法的典型用法代碼示例。如果您正苦於以下問題:Golang RWMutex.RLock方法的具體用法?Golang RWMutex.RLock怎麽用?Golang RWMutex.RLock使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類sync.RWMutex
的用法示例。
在下文中一共展示了RWMutex.RLock方法的15個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: main
func main() {
var l *sync.RWMutex
l = new(sync.RWMutex)
l.RUnlock()
fmt.Println("l")
l.RLock()
}
示例2: Task
func Task(f func(in Receiver, out Sender)) Sender {
var running bool
var l sync.RWMutex
inR, inW := Pipe()
outR, outW := Pipe()
obj := NewServer()
obj.OnAttach(Handler(func(msg *Message) error {
msg.Ret.Send(&Message{Verb: Ack, Ret: inW})
fmt.Printf("copying task output from %#v to %#v\n", outR, msg.Ret)
defer fmt.Printf("(DONE) copying task output from %#v to %#v\n", outR, msg.Ret)
Copy(msg.Ret, outR)
return nil
}))
obj.OnStart(Handler(func(msg *Message) error {
l.RLock()
r := running
l.RUnlock()
if r {
return fmt.Errorf("already running")
}
l.Lock()
go f(inR, outW)
running = true
l.Unlock()
msg.Ret.Send(&Message{Verb: Ack})
return nil
}))
return obj
}
示例3: TestSendReceiveWithWait
func TestSendReceiveWithWait(t *testing.T) {
conn := NewConn()
conn.ReceiveWait = true
conn.Command("HGETALL", "person:1").ExpectMap(map[string]string{
"name": "Mr. Johson",
"age": "42",
})
conn.Command("HGETALL", "person:2").ExpectMap(map[string]string{
"name": "Ms. Jennifer",
"age": "28",
})
ids := []string{"1", "2"}
for _, id := range ids {
conn.Send("HGETALL", fmt.Sprintf("person:%s", id))
}
var people []Person
var peopleLock sync.RWMutex
go func() {
for i := 0; i < len(ids); i++ {
values, err := redis.Values(conn.Receive())
if err != nil {
t.Fatal(err)
}
var person Person
err = redis.ScanStruct(values, &person)
if err != nil {
t.Fatal(err)
}
peopleLock.Lock()
people = append(people, person)
peopleLock.Unlock()
}
}()
for i := 0; i < len(ids); i++ {
conn.ReceiveNow <- true
}
time.Sleep(10 * time.Millisecond)
peopleLock.RLock()
defer peopleLock.RUnlock()
if len(people) != 2 {
t.Fatalf("Wrong number of people. Expected '2' and got '%d'", len(people))
}
if people[0].Name != "Mr. Johson" || people[1].Name != "Ms. Jennifer" {
t.Error("People name order are wrong")
}
if people[0].Age != 42 || people[1].Age != 28 {
t.Error("People age order are wrong")
}
}
示例4: cache
// Returns an Action that runs the original Action when there is no cached value.
// The cached value is unset after the given ttl (time to live) duration.
// A negative ttl will permanently cache
func (a Action) cache(ttl time.Duration) Action {
var data map[string]interface{}
lock := sync.RWMutex{}
return func(r *http.Request) (map[string]interface{}, error) {
lock.RLock()
if data != nil {
lock.RUnlock()
return data, nil
}
lock.RUnlock()
lock.Lock()
defer lock.Unlock()
var err error
data, err = a(r)
if data != nil {
if ttl > 0 {
time.AfterFunc(ttl, func() {
lock.Lock()
data = nil
lock.Unlock()
})
}
}
return data, err
}
}
示例5: rwlockExample
// Readers-Writers
func rwlockExample() {
runtime.GOMAXPROCS(runtime.NumCPU())
// rand.Seed(time.Now().UnixNano())
// rand.Seed(0)
l := new(sync.RWMutex)
wg := new(sync.WaitGroup)
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
r := rand.Intn(10)
time.Sleep(50 * time.Millisecond)
if r < 5 {
// I am reader.
fmt.Printf("Reader waiting %d\n", i)
l.RLock()
fmt.Printf("go reader %d\n", i)
l.RUnlock()
wg.Done()
} else {
// I am writer
fmt.Printf("Writer waiting %d\n", i)
l.Lock()
fmt.Printf("go writer %d\n", i)
time.Sleep(50 * time.Millisecond)
l.Unlock()
wg.Done()
}
}(i)
}
wg.Wait()
}
示例6: TestRaceRWMutexMultipleReaders
func TestRaceRWMutexMultipleReaders(t *testing.T) {
var mu sync.RWMutex
var x, y int64 = 0, 1
ch := make(chan bool, 3)
go func() {
mu.Lock()
defer mu.Unlock()
x = 2
ch <- true
}()
go func() {
mu.RLock()
y = x + 1
mu.RUnlock()
ch <- true
}()
go func() {
mu.RLock()
y = x + 2
mu.RUnlock()
ch <- true
}()
<-ch
<-ch
<-ch
_ = y
}
示例7: TestStream_Open_WithOp
func TestStream_Open_WithOp(t *testing.T) {
src := newStrSrc([]string{"HELLO", "WORLD", "HOW", "ARE", "YOU"})
snk := newStrSink()
op1 := api.UnFunc(func(ctx context.Context, data interface{}) interface{} {
str := data.(string)
return len(str)
})
var m sync.RWMutex
runeCount := 0
op2 := api.UnFunc(func(ctx context.Context, data interface{}) interface{} {
length := data.(int)
m.Lock()
runeCount += length
m.Unlock()
return nil
})
strm := New().From(src).Transform(op1).Transform(op2).To(snk)
select {
case err := <-strm.Open():
if err != nil {
t.Fatal(err)
}
case <-time.After(50 * time.Millisecond):
t.Fatal("Waited too long ...")
}
m.RLock()
if runeCount != 19 {
t.Fatal("Data not streaming, runeCount 19, got ", runeCount)
}
m.RUnlock()
}
示例8: TestCacheWatcherCleanupNotBlockedByResult
// verifies the cacheWatcher.process goroutine is properly cleaned up even if
// the writes to cacheWatcher.result channel is blocked.
func TestCacheWatcherCleanupNotBlockedByResult(t *testing.T) {
var lock sync.RWMutex
count := 0
filter := func(string, labels.Set, fields.Set) bool { return true }
forget := func(bool) {
lock.Lock()
defer lock.Unlock()
count++
}
initEvents := []watchCacheEvent{
{Object: &api.Pod{}},
{Object: &api.Pod{}},
}
// set the size of the buffer of w.result to 0, so that the writes to
// w.result is blocked.
w := newCacheWatcher(0, 0, initEvents, filter, forget)
w.Stop()
if err := wait.PollImmediate(1*time.Second, 5*time.Second, func() (bool, error) {
lock.RLock()
defer lock.RUnlock()
return count == 2, nil
}); err != nil {
t.Fatalf("expected forget() to be called twice, because sendWatchCacheEvent should not be blocked by the result channel: %v", err)
}
}
示例9: TestNoRaceRWMutexMultipleReaders
func TestNoRaceRWMutexMultipleReaders(t *testing.T) {
var mu sync.RWMutex
x := int64(0)
ch := make(chan bool, 3)
go func() {
mu.Lock()
defer mu.Unlock()
x = 2
ch <- true
}()
go func() {
mu.RLock()
y := x + 1
_ = y
mu.RUnlock()
ch <- true
}()
go func() {
mu.RLock()
y := x + 2
_ = y
mu.RUnlock()
ch <- true
}()
<-ch
<-ch
<-ch
}
示例10: BenchmarkRWMutexR1
func BenchmarkRWMutexR1(b *testing.B) {
var mtx sync.RWMutex
for i := 0; i < b.N; i++ {
mtx.RLock()
mtx.RUnlock()
}
}
示例11: BenchmarkRWMutexRLock
func BenchmarkRWMutexRLock(b *testing.B) {
var l sync.RWMutex
for i := 0; i < b.N; i++ {
l.RLock()
l.RUnlock()
}
}
示例12: compileVariableNode
func compileVariableNode(node *parse.VariableNode, dotType reflect.Type, args []parse.Node, finalType reflect.Type) (cmd command, retType reflect.Type) {
var mu sync.RWMutex
type key struct {
dotType, finalType reflect.Type
}
cache := make(map[key]command)
name := node.Ident[0]
cmd = func(s state, dot, final interface{}) interface{} {
value := s.varValue(name)
if len(node.Ident) == 1 {
return value.Interface()
}
if dotType == nil {
dotType = reflect.ValueOf(dot).Type()
}
if finalType == nil && final != nil {
finalType = reflect.ValueOf(final).Type()
}
k := key{dotType, finalType}
mu.RLock()
f, exist := cache[k]
mu.RUnlock()
if !exist {
f, _ = compileFieldChain(node.Ident[1:], dotType, args, finalType)
mu.Lock()
cache[k] = f
mu.Unlock()
}
return f(s, dot, value)
}
return
}
示例13: main
func main() {
Case := Init(6)
fmt.Printf("DEADLOCK\n")
c := make(chan int)
var mu sync.RWMutex
done := make(chan bool)
go func() {
time.Sleep(sleep3[Case][0])
mu.RLock()
c <- 1
mu.RUnlock()
done <- true
}()
go func() {
time.Sleep(sleep3[Case][1])
mu.RLock()
loop:
for {
select {
case <-c:
break loop
case <-time.After(time.Millisecond):
}
}
mu.RUnlock()
done <- true
}()
time.Sleep(sleep3[Case][2])
mu.Lock()
mu.Unlock()
<-done
<-done
}
示例14: compileFieldDynamic
func compileFieldDynamic(name string, args []parse.Node) lookupFn {
type key struct {
valueType reflect.Type
finalType reflect.Type
}
var m sync.RWMutex
cache := make(map[key]lookupFn)
return func(s state, value reflect.Value, final interface{}) reflect.Value {
valueType := value.Elem().Type()
var finalType reflect.Type
if v := reflect.ValueOf(final); v.IsValid() {
finalType = v.Type()
}
k := key{valueType, finalType}
m.RLock()
f, exist := cache[k]
m.RUnlock()
if !exist {
f, _ = compileField(valueType, name, args, finalType)
m.Lock()
cache[k] = f
m.Unlock()
}
return f(s, value.Elem(), final)
}
}
示例15: main
func main() {
Case := Init(6)
fmt.Printf("DEADLOCK\n")
c := make(chan int)
var mu sync.RWMutex
done := make(chan bool)
go func() {
time.Sleep(sleep3[Case][0])
mu.RLock()
c <- 1
mu.RUnlock()
done <- true
}()
go func() {
time.Sleep(sleep3[Case][1])
mu.RLock()
<-c
mu.RUnlock()
done <- true
}()
time.Sleep(sleep3[Case][2])
mu.Lock()
mu.Unlock()
<-done
<-done
}