MSDN
CLR Reusable Sample Codes
Last updated
on
2014/2558
10
8
,
a full moon day;
... ;
IFF
code (snippets)
also see: keyword;
CLR Reusable
Parallel Data Structure & Algorithm, for Microsoft .NET Framework(s),
MSDN
Magazine, June 2007 as referenced info; The following
code
modules are platform
dependent, regarding Microsoft, also see:
this DOMAIN is
developed by, however if modify, e.g. its control flow, e.g. its
data flow, ...
, can
be used in
any other platforms; In an era between
binary to
duo-binary (a.k.a.
dual binary bit) ... ;
Artificial Intelligence (Method;
Operator; ...
); Since physical memories,
virtual swap spaces
a storage,
... are re-writable and volatile, in computing, assignment operator
single equal sign
= makes complexity; therefore
5W1H concept is a must, because 1 space
of memory may contain N references, N type_ value, N
something, ... , those N of N becomes in action to
compute and very difficult to understand in programming, however 1 time
of time period may contain only 1 time ...
makes easier;
/*
// MSDN reusable Await */public void Await() {
/* // REMARK a
function() as void i.e. void function_
name()
does not return value */
bool sense =
m_ sense;
/*
// REMARK sense is defined as Boolean thus either T or F *//* // REMARK
thread to signal; setting event; */if (
m_
count ==
1 || Interlocked . Decrement (ref
m_
count) ==
0) {
/* // REMARK
passing m_ count as reference into Interlocked 's decrement function */
m_
count =
m_ original
Count;
m_ sense = !sense;
/*
// REMARK reversing the sense, which has been assigned as Boolean type */if (sense == true) {
/*
// REMARK odd */
m_ even Event. Set();
m_ odd Event. Reset(); } else {
/*
// REMARK even */
m_ odd Event. Set();
m_ even Event. Reset(); }} else {Spin Wait
s = new
Spin Wait();
while (sense ==
m_ sense) { if (
s. Spin ()
>=
s_ spin
Count) {if (sense == true)
m_ odd Event. Wait One();else
m_ even Event. Wait One();}}}}
/*
//
REMARK MSDN reusable Await
ends here
*/
/ * // MSDN reusable Barrier
*/using
System; using
System. Threading;
/* // REMARK also see:
Thread vs.
Multithreaded CPU */public
class Barrier { private volatile int
m_
count; private int
m_ original
Count; private Event Wait Handle
m_ odd Event; private Event Wait Handle
m_ even Event;
/* // REMARK Usage
even and odd refers to parity, check sum, ... ; */private volatile bool
m_ sense =
false;
/* // REMARK false == even, true == odd */public Barrier (
int
count) {
m_
count =
count;
m_ original
Count =
count;
m_ odd Event = new
Manual Reset Event (false);
m_ even Event = new
Manual Reset Event (false); } public void Await() { bool sense =
m_ sense;
/* // REMARK
thread to signal; also setting the event; */if (
m_
count ==
1 || Interlocked. Decrement (ref
m_
count) ==
0) {
m_
count =
m_ original
Count;
m_ sense = !sense;
/* // REMARK
reversing the sense, which has been assigned as Boolean type */if (sense == true) {
/*
// REMARK odd */
m_ even Event. Reset();
m_ odd Event. Set(); } else {
/*
// REMARK even */
m_ odd Event. Reset();
m_ even Event. Set(); }} else {if (sense == true)
m_ odd Event. Wait One(); else
m_ even Event. Wait One(); }}}
/* //
REMARK MSDN reusable Barrier
ends here */
/* MSDN reusable
Blocking Queue */
class
Cell <
T> {internal
T
m_
obj;
/*
// REMARK obj stands for object */internal Cell(
T
obj) {
m_
obj =
obj; }}public
class Blocking Queue<
T>
{
/* // REMARK
before understanding the term Blocking *//*// REMARK
1st to understand conditional
variable,
mutexes,
semaphores,
... *//* // REMARK
2nd to understand flag behavior alike the most important 2nd Time &
Lunar Gravitational */
private Queue<Cell<
T>>
m_ queue
= new Queue<Cell<
T>>(); public void En queue(
T
obj) {Cell<
T>
c = new Cell<
T>(
obj); lock (
m_ queue) { m_ queue. En queue(
c); Monitor. Pulse(
m_ queue); Monitor. Wait (
m_ queue);}}public
T De queue() {Cell<
T>
c;lock (
m_ queue) {
while (
m_ queue.
Count ==
0)
/* // REMARK 1st
to understand
Count down Latch's count
*//* // REMARK 2nd
to understand
semaphores
*//* // REMARK 3rd
to understand block, lock, wait, ... IFF count == null */Monitor. Wait (
m_ queue);
c =
m_ queue. De queue(); Monitor. Pulse(
m_ queue);} return
c.
m_
obj;}}
/*
//
REMARK MSDN reusable Blocking Queue
ends here */
/* MSDN reusable
Bounded Buffer */public
class Bounded Buffer<
T> {private Queue<
T>
m_ queue = new
Queue<
T>();private
int
m_ consumers Waiting;private
int
m_ producers Waiting;private const
int
s_ max Buffer Size = 128;public void En queue(
T
obj) {lock (
m_ queue) {
while (
m_ queue. Count ==
s_ max Buffer Size -
1)) {
m_ producers Waiting++;Monitor. Wait (
m_ queue);
m_ producers Waiting--;}
m_ queue. En queue (
obj);if (
m_ consumers Waiting >
0)Monitor. Pulse All (
m_ queue);}}public
T Dequeue() {
T
e;
/* //
REMARK local variable e is defined as T */lock (
m_ queue) {
while (
m_ queue. Count ==
0) {
m_ consumers Waiting++;Monitor. Wait(
m_ queue);
m_ consumers Waiting--;}
e =
m_ queue. Dequeue();if (
m_ producers Waiting >
0)Monitor. Pulse All (
m_ queue);}return
e;}}
/* //
REMARK MSDN reusable Bounded Buffer
ends here */
/* MSDN reusable
Count down Latch */public
class
Count down Latch {
/*
// REMARK counting
semaphore
in
concurrency */private int
m_ remain;private Event Wait Handle
m_ event;public Count down Latch (
int
count) {
m_ remain =
count;
m_ event = new
Manual Reset Event( false);}public void Signal() {/* // REMARK
the last thread to signal
which also sets event */if (interlocked. Decrement (ref
m_ remain) ==
0)
m_ event. Set();}public void Wait() {
m_ event. Wait One();}}
/* //
REMARK MSDN reusable Count down Latch
ends here */
/* MSDN reusable For All
*/ /* // REMARK it is recommended not to know all, also see:
Servers;
*/public static void For All (
int
from,
int to, Action<
int>
a,
int
p) {
/* // REMARK also see:
static
configuration; */For All<
int>(null,
from, to, null,
a,
p);}public static void For All<
T>(
I List<
T>
data, Action<
T>
a,
int
p) {For All<
T>(
data,
0,
data.
Count,
a,
null,
p);}private static void For All<
T>(
I List<
T>
data,
int from,
int to, Action<
T>
a0, Action<
int>
a1,
int
p) {
int size = from - to;
int stride = (size +
p -
1) /
p;Count down Latch latch = new
Count down Latch (
p);
/* // REMARK
this DOMAIN recommends
less pin count
design *//*// REMARK for
example, SHARP PC with Trans meta to SONY PC with AMD, Intel, ... */for (
int
i =
0;
i <
p;
i++) {
/*
// REMARK for control loop with adder adding 1 */
int
idx =
i;Thread Pool. Queue User Work Item (delegate
{
int
end =
Math. Min (size, stride * (
idx +
1));
/* // REMARK
Math class'
Reduction Min */for (
int
j = stride *
idx;
j <
end;
j++) {
/* // REMARK for control loop with adder adding
stride *
idx */if (
data !=
null) a0(
data [
j]);
/* // REMARK
array is used because offset of array is needed
*/else a1(
j);}latch. Signal();
/*
// REMARK latch's frequency, on the other hand,
not latch's
architecture */});}latch. Wait();}
/* //
REMARK MSDN reusable For All
ends here */
/* MSDN reusable
Lock Free Stack */public
class Lock Free Stack<
T> {private volatile
Stack Node<
T>
m_ head;public void Push(
T
item) {
/* // REMARK item
as type_ value T to a stack, by pushing, also see: from a stack
*/Stack Node<
T>
node
= new Stack Node<
T>(item);Stack Node<
T> head; do {head =
m_ head;node.
m_ next = head; }
while (
m_ head != head ||
Interlocked. Compare Exchange (ref
m_ head, node, head) != head);}public
T Pop() {
/* // REMARK
whatever value from a stack, by popping, also see: to a stack
*/Stack Node<
T> head;
Spin Wait
s = new Spin Wait();
while (true) { Stack Node<
T> next; do {head =
m_ head; if (head ==
null) go to empty Spin;
/* //
REMARK IFF no head */ next = head.
m_ next; }
while (
m_ head != head ||
Inter locked. Compare Exchange (ref
m_ head, next, head) != head);
/* // REMARK
head and next are previously defined as
Stack Node<T>
*/break;
/* //
because go to jumps and skips */empty Spin:
s. Spin();
/*
//REMARK Spin Wait. Spin()
returns old_ count */}return head.
m_ value;}}
class
Stack Node<
T> {internal
T
m_ value;internal Stack Node<
T>
m_ next;internal Stack Node(
T val)
{
m_ value = val; }}
/*
// REMARK
MSDN
reusable Lock Free Stack
ends here
*/
/* MSDN reusable
Reduce */public delegate
T Func<
T>(
T
arg0,
T arg1);
/* // REMARK arguments
*/public static
T Reduce<
T>(
I List<
T>
data,
int
p,
T seed, Func<
T>
r){
T[] partial = new
T [
p];
int stride = (
data .
Count +
p -
1) /
p;Count down Latch latch = new
Count down Latch (
p);for (
int
i =
0;
i <
p;
i++) {
/*
// REMARK for control loop with adder adding 1 */
int
idx =
i;Thread Pool. Queue User Work Item (delegate {partial [
idx] = seed;
/*
// REMARK doing
reduction in parallel
*/
int end = Math. Min (
data.
Count,
stride * (
idx +
1));
/* // REMARK
Math class'
Reduction Min */for (
int
j = stride *
idx;
j <
end;
j++)
/* // REMARK for control loop with adder adding stride *
idx */partial [
idx] =
r (partial [
idx],
data [
j]);
/* // REMARK partial, because fuzzy logic exists, so
partially ... */ latch. Signal();});}latch.
Wait();
T final = seed;
/*
// REMARK master thread's final reduction */for (
int
i =
0;
i <
p;
i++)final =
r (final, partial [
i]);return final;}
/* //
REMARK MSDN reusable Reduce
ends here */
/* MSDN reusable
Spin Wait */public struct Spin Wait {private
int
m_
count;private static read only bool
s_ is Single Proc = (Environment. Processor
Count ==
1);private const
int
s_ yield Frequency = 4000;
/* // REMARK also see:
4KB
for 1 CPU; */private const
int
s_ yield One Frequency =
3 *
s_ yield Frequency;
/* // REMARK constant integer
*/public
int
Spin() {
int
old
Count =
m_
count;
/* // REMARK On 1
CPU, ensure counter is a multiple of 's_ yield Frequency', thus yield every time
*//*
// REMARK
Else, increment by one; also see:
Thin Event's set()
function's setting
m_ state
*/
m_
count += (
s_ is Single Proc ?
s_ yield Frequency :
1);
/* // REMARK If
not a multiple of 's_ yield Frequency' spin (w/ back off) */
int
count Mod Frequency =
m_
count
%
s_ yield Frequency;if (
count Mod Frequency >
0)Thread. Spin Wait ((
int) (
1 +
(
count Mod Frequency *
0.05
f)));
/* // REMARK
0.05f might be related to
Thermal EMF
*/else Thread. Sleep(
m_
count <=
s_ yield One Frequency ?
0 :
1);
/* // REMARK
binary operator either Zero or One might be related to
parity bit, regular
bit, ... ;
*/return
old
Count;
/*
// REMARK after computing m_ count */}private void Yield() {Thread. Sleep (m_
count <
s_ yield One Frequency ?
0 :
1);}}
/* //
REMARK MSDN reusable Spin Wait
ends here */
/* MSDN reusable
Thin Event */public struct Thin Event {
/* // REMARK
3 internal local functions such as
Set,
Reset,
Wait, ... to compute Thin Event's state A Q
*/private
int
m_
state;
/*
// Unset is zero, Set is one; m_ state is defined as integer data-type */private Event Wait Handle
m_ event
Obj; private const
int
s_ spin
Count =
4000; /* // REMARK also see:
4KB
for 1 CPU; */public void Set()
{
/* // REMARK a function() as void i.e. void function_
name()
does not return value */
m_ state =
1;
/*
// REMARK if bit,
1 is either TRUE, Magnet, High, On, ... ; if
value, 1
is integer one; */Thread. Memory Barrier();
/* // REMARK MSDN's standard requirement
*/if (
m_ event
Obj !=
null)
/* //
REMARK IFF something exists; != is not equal to, not assign to,
... ; */
m_ event
Obj. Set();} public void
Reset() {
/* // REMARK a function() as void i.e. void function_
name()
does not return value */
m_ state =
0;
/* // REMARK in
Set() function, Thread . Memory Barrier() is needed *//*
// REMARK
inside this Reset() function,
Thread . Memory Barrier()
is not needed */ /*
// REMARK 1st
to understand
semaphores, ... ;
*/if (
m_ event
Obj !=
null)
/* //
REMARK IFF something exists */
m_ event
Obj . Reset();}public void Wait()
{
/* // REMARK a function() as void i.e. void function_
name()
does not return value *//* // REMARK
local variable s is defined as Spin Wait
*/Spin Wait
s = new Spin Wait();
while (
m_ state ==
0) {
/*
// REMARK while m_ state is equal to zero *//*
// REMARK WHICH
means resetting function Reset() is true *//* // REMARK the
following line might be counting 4K, after 4K, after 4K, until ... */
if (
s . Spin() >=
s_ spin
Count) {if (
m_ event
Obj ==
null) {Manual Reset Event new Event = new
Manual Reset Event(
m_ state ==
1);if (Interlocked . Compare Exchange<Event Wait Handle>(ref
m_ event
Obj , new Event, null) ==
null) {
/* // REMARK event
object sets flag */if (
m_
state ==
1)
m_ event
Obj . Set(); } else {
/* // REMARK using
only event */new Event . Close();}}
m_ event
Obj . Wait One();}}}}
/* //
REMARK MSDN reusable Thin Event
ends here */
...
;
![]() |