Skip to content

Instantly share code, notes, and snippets.

@rbmm
Last active March 2, 2024 00:20
Show Gist options
  • Save rbmm/678abaa008f12aaf1851e5df6e670515 to your computer and use it in GitHub Desktop.
Save rbmm/678abaa008f12aaf1851e5df6e670515 to your computer and use it in GitHub Desktop.
struct ThreadTestData
{
HANDLE hEvent;
SRWLOCK SRWLock = {};
LONG numThreads = 1;
LONG readCounter = 0;
void EndThread()
{
if (!InterlockedDecrementNoFence(&numThreads))
{
if (!SetEvent(hEvent)) __debugbreak();
}
}
void DoStuff()
{
AcquireSRWLockShared(&SRWLock);
ULONG n = 0, m = 0, k = InterlockedDecrementNoFence(&readCounter);
while (readCounter)
{
switch (NtYieldExecution())
{
case STATUS_SUCCESS:
n++;
break;
case STATUS_NO_YIELD_PERFORMED:
m++;
break;
default:
__debugbreak();
}
}
ReleaseSRWLockShared(&SRWLock);
DbgPrint("%x> %x/%x\n", k, n, m);
EndThread();
}
static ULONG WINAPI _S_DoStuff(PVOID data)
{
reinterpret_cast<ThreadTestData*>(data)->DoStuff();
return 0;
}
void Test(ULONG n)
{
if (hEvent = CreateEventW(0, 0, 0, 0))
{
AcquireSRWLockExclusive(&SRWLock);
do
{
numThreads++;
readCounter++;
if (HANDLE hThread = CreateThread(0, 0, _S_DoStuff, this, 0, 0))
{
CloseHandle(hThread);
}
else
{
readCounter--;
numThreads--;
}
} while (--n);
ReleaseSRWLockExclusive(&SRWLock);
EndThread();
if (WAIT_OBJECT_0 != WaitForSingleObject(hEvent, INFINITE))
{
__debugbreak();
}
CloseHandle(hEvent);
}
}
};
void ep()
{
ThreadTestData data;
data.Test(8);
}
/*-- for 8 threads
3> 9/e0
0> 0/0
4> 0/30d
1> 5/6
6> 0/3ba
2> 4/1f
5> 1/32c
7> 7/38d
--*/
/*-- for 64 threads
38> 2b/0
32> 29/0
d> d/0
24> 29/0
25> 27/0
22> 26/0
0> 0/0
28> 2a/0
3e> 2e/1c
39> 2d/0
3c> 2b/0
3d> 2d/13
3f> 2d/1
37> 2b/0
33> 2b/0
34> 2c/0
3b> 2c/0
36> 2c/0
2c> 29/0
31> 2b/0
2f> 2c/0
26> 2b/0
35> 2b/0
27> 29/0
30> 2b/0
2e> 2b/0
1e> 28/0
2d> 29/0
20> 27/0
21> 29/0
1> 2/0
3a> 2d/0
2b> 2c/0
1d> 26/0
1c> 23/0
1b> 23/0
19> 1f/0
18> 1c/0
2a> 29/0
17> 1c/0
15> 18/0
1a> 22/0
16> 1b/0
12> 15/0
14> 17/0
13> 15/0
e> 10/0
11> 12/0
f> 10/0
10> 12/0
23> 27/0
c> d/0
b> c/0
9> a/0
8> 9/0
a> b/0
7> 8/0
4> 5/0
1f> 26/0
5> 5/0
6> 7/0
2> 3/0
3> 4/0
29> 2b/0
--*/
/*-- for 13 threads
5> 19/37
4> 13/0
0> 0/0
c> 1e/35
6> 1f/3b
8> 25/38
b> 27/4a
a> 26/5e
7> 1e/35
1> 5/0
3> 10/0
9> 21/62
2> d/0
--*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment