forked from cheng/wallet
76 lines
2.3 KiB
HTML
76 lines
2.3 KiB
HTML
|
<!DOCTYPE html>
|
|||
|
<html lang="en">
|
|||
|
<head>
|
|||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|||
|
<style>
|
|||
|
body {
|
|||
|
max-width: 30em;
|
|||
|
margin-left: 2em;
|
|||
|
}
|
|||
|
p.center {
|
|||
|
text-align:center;
|
|||
|
}
|
|||
|
</style>
|
|||
|
<link rel="shortcut icon" href="../rho.ico">
|
|||
|
<title>Write your own InterlockedXxx
|
|||
|
operation</title> </head> <body>
|
|||
|
|
|||
|
<p><A href="./"> To Home page</A> </p>
|
|||
|
|
|||
|
<h1>Write your own InterlockedXxx
|
|||
|
operation</h1><p>
|
|||
|
|
|||
|
It has long been known that InterlockedCompareExchange can be
|
|||
|
used to write any Interlockedxxx operation. </p>
|
|||
|
|
|||
|
<pre>
|
|||
|
long InterlockedXxx(
|
|||
|
__inout long volatile *Target,
|
|||
|
, whatever parameters we need for Xxx
|
|||
|
)
|
|||
|
{
|
|||
|
long prevValue, prevCopy;
|
|||
|
|
|||
|
prevValue = *Target;
|
|||
|
|
|||
|
do {
|
|||
|
if Xxx operations is illegal on prevValue, return with error code
|
|||
|
|
|||
|
prevCopy = prevValue;
|
|||
|
|
|||
|
//
|
|||
|
// prevValue will be the value that used to be Target if the exchange was made
|
|||
|
// or its current value if the exchange was not made.
|
|||
|
//
|
|||
|
prevValue = InterlockedCompareExchange(Target, Xxx operation on prevCopy, prevValue);
|
|||
|
|
|||
|
//
|
|||
|
// If prevCopy == prevValue, then no one updated Target in between the deref at the top
|
|||
|
// and the InterlockecCompareExchange afterward and we are done
|
|||
|
//
|
|||
|
} while (prevCopy != prevValue);
|
|||
|
|
|||
|
//
|
|||
|
// [value] can be anything you want, but it is typically either
|
|||
|
// a) The new value stored in Target. This is the type of return value that
|
|||
|
// InterlockedIncrement returns
|
|||
|
// or
|
|||
|
// b) The new value is the previous value that was in Target. This si the
|
|||
|
// type of return value that InterlockedOr or InterlockedExchange return
|
|||
|
//
|
|||
|
return [value];
|
|||
|
}</pre><p>
|
|||
|
|
|||
|
Structures larger than a long can be handled by
|
|||
|
using InterlockedCompareExchange to add to a
|
|||
|
linked list, or remove stuff from a linked
|
|||
|
list. Of course you should not be writing such
|
|||
|
things yourself, when Intel has already written
|
|||
|
it for you. </p>
|
|||
|
|
|||
|
<p style="background-color : #ccffcc; font-size:80%">These documents are
|
|||
|
licensed under the <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">Creative
|
|||
|
Commons Attribution-Share Alike 3.0 License</a></p>
|
|||
|
</body></html>
|
|||
|
|