Last active
March 2, 2024 00:20
-
-
Save rbmm/678abaa008f12aaf1851e5df6e670515 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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