Skip to content

Commit fdf4634

Browse files
authored
Merge pull request #774 from devlights/add-mutex-trylock-example
2 parents c2ca96c + 576f079 commit fdf4634

File tree

3 files changed

+70
-16
lines changed

3 files changed

+70
-16
lines changed

examples/basic/syncs/README.md

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@
22

33
このディレクトリには以下のサンプルがあります。
44

5-
| file | example name | note |
6-
|---------------------------|-------------------------------|-------------------------------------------------|
7-
| atomic\_add.go | syncs\_atomic\_add | atomic.AddXXX のサンプルです |
8-
| atomic\_compareandswap.go | syncs\_atomic\_compareandswap | sync/atomic.CompareAndSwap のサンプルです |
9-
| atomic\_types.go | syncs\_atomic\_types | Go 1.19 から追加された sync/atomic パッケージ内の型についてのサンプルです |
10-
| use\_map.go | syncs\_use\_map | sync.Mapの使い方とそれをラップした型の紹介です |
11-
| no\_sync.go | syncs\_no\_sync | 同期なしで非同期処理をしているサンプルです |
12-
| use\_channel.go | syncs\_use\_channel | 値の同期をチャネルを使って実現しているサンプルです |
13-
| use\_cond\_broadcast.go | syncs\_use\_cond\_broadcast | sync.Cond.Broadcast() のサンプルです |
14-
| use\_cond\_siginal.go | syncs\_use\_cond\_signal | sync.Cond.Signal() のサンプルです |
15-
| use\_mutex.go | syncs\_use\_mutex | sync.Mutex のサンプルです |
16-
| use\_once.go | syncs\_use\_once | sync.Onceのサンプルです |
17-
| use\_oncefunc.go | syncs\_use\_oncefunc | Go 1.21 で追加された sync.OnceFunc() のサンプルです |
18-
| use\_oncevalue.go | syncs\_use\_oncevalue | Go 1.21 で追加された sync.OnceValue() のサンプルです |
19-
| use\_oncevalues.go | syncs\_use\_oncevalues | Go 1.21 で追加された sync.OnceValues() のサンプルです |
20-
| use\_pool.go | syncs\_use\_pool | sync.Poolのサンプルです |
5+
| file | example name | note |
6+
| ------------------------ | --------------------------- | ------------------------------------------------------------------------- |
7+
| atomic_add.go | syncs_atomic_add | atomic.AddXXX のサンプルです |
8+
| atomic_compareandswap.go | syncs_atomic_compareandswap | sync/atomic.CompareAndSwap のサンプルです |
9+
| atomic_types.go | syncs_atomic_types | Go 1.19 から追加された sync/atomic パッケージ内の型についてのサンプルです |
10+
| use_map.go | syncs_use_map | sync.Mapの使い方とそれをラップした型の紹介です |
11+
| no_sync.go | syncs_no_sync | 同期なしで非同期処理をしているサンプルです |
12+
| use_channel.go | syncs_use_channel | 値の同期をチャネルを使って実現しているサンプルです |
13+
| use_cond_broadcast.go | syncs_use_cond_broadcast | sync.Cond.Broadcast() のサンプルです |
14+
| use_cond_siginal.go | syncs_use_cond_signal | sync.Cond.Signal() のサンプルです |
15+
| use_mutex.go | syncs_use_mutex | sync.Mutex のサンプルです |
16+
| use_once.go | syncs_use_once | sync.Onceのサンプルです |
17+
| use_oncefunc.go | syncs_use_oncefunc | Go 1.21 で追加された sync.OnceFunc() のサンプルです |
18+
| use_oncevalue.go | syncs_use_oncevalue | Go 1.21 で追加された sync.OnceValue() のサンプルです |
19+
| use_oncevalues.go | syncs_use_oncevalues | Go 1.21 で追加された sync.OnceValues() のサンプルです |
20+
| use_pool.go | syncs_use_pool | sync.Poolのサンプルです |
21+
| mutex_trylock.go | syncs_mutex_trylock | Go 1.18 で追加された mutex.TryLock() についてのサンプルです。 |

examples/basic/syncs/examples.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
2727
m["syncs_use_oncevalue"] = UseOnceValue
2828
m["syncs_use_oncevalues"] = UseOnceValues
2929
m["syncs_use_pool"] = UsePool
30+
m["syncs_mutex_trylock"] = MutexTryLock
3031
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package syncs
2+
3+
import (
4+
"sync"
5+
"time"
6+
7+
"github.com/devlights/gomy/output"
8+
)
9+
10+
// MutexTryLock は、Go 1.18 で追加された mutex.TryLock() についてのサンプルです。
11+
//
12+
// > TryLock tries to lock m and reports whether it succeeded.
13+
//
14+
// > (TryLockはmをロックしようとし、成功したかどうかを報告します。)
15+
//
16+
// # REFERENCES
17+
//
18+
// - https://pkg.go.dev/sync@go1.22.1#Mutex.TryLock
19+
func MutexTryLock() error {
20+
const (
21+
WAIT_SECS = 5
22+
)
23+
24+
var (
25+
m sync.Mutex
26+
start = make(chan struct{})
27+
lock5secs = func() {
28+
m.Lock()
29+
defer m.Unlock()
30+
31+
close(start)
32+
time.Sleep(WAIT_SECS * time.Second)
33+
}
34+
printStatus = func() {
35+
output.Stdoutf("[TryLock]", "%s\tTryLock=%v\n", time.Now().Format(time.TimeOnly), m.TryLock())
36+
}
37+
)
38+
39+
// 5秒間 mutex をロックし続ける
40+
go lock5secs()
41+
<-start
42+
43+
for range WAIT_SECS {
44+
printStatus()
45+
time.Sleep(1 * time.Second)
46+
}
47+
48+
// ここは mutex がアンロックされているのでロックが取れる
49+
printStatus()
50+
51+
return nil
52+
}

0 commit comments

Comments
 (0)