Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
G
golang
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
golang
Commits
8ba28758
Commit
8ba28758
authored
Mar 05, 2009
by
Russ Cox
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
sync: add documentation
R=r DELTA=63 (57 added, 1 deleted, 5 changed) OCL=25727 CL=25727
parent
a0feb325
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
62 additions
and
6 deletions
+62
-6
mutex.go
src/lib/sync/mutex.go
+62
-6
No files found.
src/lib/sync/mutex.go
View file @
8ba28758
...
...
@@ -2,12 +2,19 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// The sync package provides basic synchronization primitives
// such as mutual exclusion locks. These are intended for use
// by low-level library routines. Higher-level synchronization
// is better done via channels and communication.
package
sync
func
cas
(
val
*
int32
,
old
,
new
int32
)
bool
func
semacquire
(
*
int32
)
func
semrelease
(
*
int32
)
// A Mutex is a mutual exclusion lock.
// Mutexes can be created as part of other structures;
// the zero value for a Mutex is an unlocked mutex.
type
Mutex
struct
{
key
int32
;
sema
int32
;
...
...
@@ -23,6 +30,9 @@ func xadd(val *int32, delta int32) (new int32) {
panic
(
"unreached"
)
}
// Lock locks m.
// If the lock is already in use, the calling goroutine
// blocks until the mutex is available.
func
(
m
*
Mutex
)
Lock
()
{
if
xadd
(
&
m
.
key
,
1
)
==
1
{
// changed from 0 to 1; we hold lock
...
...
@@ -31,6 +41,12 @@ func (m *Mutex) Lock() {
semacquire
(
&
m
.
sema
);
}
// Unlock unlocks m.
// It is a run-time error if m is not locked on entry to Unlock.
//
// A locked Mutex is not associated with a particular goroutine.
// It is allowed for one goroutine to lock a Mutex and then
// arrange for another goroutine to unlock it.
func
(
m
*
Mutex
)
Unlock
()
{
if
xadd
(
&
m
.
key
,
-
1
)
==
0
{
// changed from 1 to 0; no contention
...
...
@@ -42,17 +58,57 @@ func (m *Mutex) Unlock() {
// Stub implementation of r/w locks.
// This satisfies the semantics but
// is not terribly efficient.
// TODO(rsc): Real r/w locks.
// The next comment goes in the BUGS section of the document,
// in its own paragraph, without the (rsc) tag.
// BUG(rsc): RWMutex does not (yet) allow multiple readers;
// instead it behaves as if RLock and RUnlock were Lock and Unlock.
// An RWMutex is a reader/writer mutual exclusion lock.
// The lock can be held by an arbitrary number of readers
// or a single writer.
// RWMutexes can be created as part of other
// structures; the zero value for a RWMutex is
// an unlocked mutex.
type
RWMutex
struct
{
Mutex
;
m
Mutex
;
}
// RLock locks rw for reading.
// If the lock is already locked for writing or there is a writer already waiting
// to acquire the lock, RLock blocks until the writer has released the lock.
func
(
rw
*
RWMutex
)
RLock
()
{
rw
.
m
.
Lock
();
}
// RUnlock undoes a single RLock call;
// it does not affect other simultaneous readers.
// It is a run-time error if rw is not locked for reading
// on entry to RUnlock.
func
(
rw
*
RWMutex
)
RUnlock
()
{
rw
.
m
.
Unlock
();
}
func
(
m
*
RWMutex
)
RLock
()
{
m
.
Lock
();
// Lock locks rw for writing.
// If the lock is already locked for reading or writing,
// Lock blocks until the lock is available.
// To ensure that the lock eventually becomes available,
// a blocked Lock call excludes new readers from acquiring
// the lock.
func
(
rw
*
RWMutex
)
Lock
()
{
rw
.
m
.
Lock
();
}
func
(
m
*
RWMutex
)
RUnlock
()
{
m
.
Unlock
();
// Unlock unlocks rw for writing.
// It is a run-time error if rw is not locked for writing
// on entry to Unlock.
//
// Like for Mutexes,
// a locked RWMutex is not associated with a particular goroutine.
// It is allowed for one goroutine to RLock (Lock) an RWMutex and then
// arrange for another goroutine to RUnlock (Unlock) it.
func
(
rw
*
RWMutex
)
Unlock
()
{
rw
.
m
.
Unlock
();
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment