Content deleted Content added
Copy reference from double-checked locking, since whoever added the {{Fact}} apparently couldn't follow a link. |
#suggestededit-add-desc 1.0 Tags: Mobile edit Mobile app edit Android app edit |
||
(22 intermediate revisions by 17 users not shown) | |||
Line 1:
{{Short description|CPU Instruction}}
In [[computer
[[mutual exclusion]] in [[multiprocessor]] environments. Although a correct [[lock (computer science)|lock]] can be implemented with test-and-set,
Given a lock:
''boolean'' locked := false ''// shared lock variable''
the entry protocol is:
'''procedure''' EnterCritical() {
'''do''' {
'''while''' ( locked == true )
'''skip''' ''// spin using normal instructions until the lock is free''
} '''while''' ( ''TestAndSet''(locked) == true ) ''// attempt actual atomic locking using the [[test-and-set]] instruction''
}
'''procedure''' ExitCritical() {
locked := false
}
The difference to the simple test-and-set protocol is the additional spin-loop (the ''test'' in ''test and test-and-set'') at the start of the entry protocol, which utilizes ordinary load instructions. The load in this loop executes with less overhead compared to an atomic operation (resp. a [[Load-link/store-conditional | load-exclusive]] instruction). E.g., on a system utilizing the [[MESI]] cache coherency protocol, the cache line being loaded is moved to the Shared state, whereas a test-and-set instruction or a load-exclusive instruction moves it into the Exclusive state.
This is particularly advantageous if multiple processors are contending for the same lock: whereas an atomic instruction or load-exclusive instruction requires a coherency-protocol transaction to give that processor exclusive access to the cache line (causing that line to ping-pong between the involved processors), ordinary loads on a line in Shared state require no protocol transactions at all: processors spinning in the inner loop operate purely locally.
Cache-coherency protocol transactions are used only in the outer loop, after the initial check has ascertained that they have a reasonable likelihood of success.
If the [[programming language]] used supports [[short-circuit evaluation]], the entry protocol could be implemented as:
Line 27 ⟶ 33:
==Caveat==
Although this [[Optimization (computer science)|optimization]] is useful in [[system programming]],
the knowledge of who is blocking on what. Consequently, the scheduler will have to guess on how to allocate CPU time among the threads -- typically just allowing the threads to use up their timing quota. Threads will end up spinning unproductively, waiting for threads that are not scheduled.
By using operating-system provided lock objects, such as mutexes, the OS can schedule exactly the unblocked threads.
==See also==
Line 37 ⟶ 46:
==References==
* Gregory R. Andrews, ''Foundations of Multithreaded, Parallel, and Distributed Programming'', pp. 100-101. Addison-Wesley, 2000. ISBN 0-201-35752-6.▼
{{reflist}}
▲* Gregory R. Andrews, ''Foundations of Multithreaded, Parallel, and Distributed Programming'', pp.
[[Category:Concurrency control]]
|