mirror of
https://github.com/farcasclaudiu/SmartThreadPool.git
synced 2026-06-22 09:01:19 +03:00
96 lines
1.9 KiB
C#
96 lines
1.9 KiB
C#
using System;
|
|
using System.Threading;
|
|
|
|
using NUnit.Framework;
|
|
|
|
using Amib.Threading;
|
|
|
|
namespace WorkItemsGroupTests
|
|
{
|
|
/// <summary>
|
|
/// Summary description for TestWIGConcurrency.
|
|
/// </summary>
|
|
[TestFixture]
|
|
[Category("TestWIGConcurrency")]
|
|
public class TestWIGConcurrency
|
|
{
|
|
private Random _randGen;
|
|
private int [] _concurrentOps;
|
|
private int _concurrencyPerWig;
|
|
private bool _success;
|
|
|
|
[Test]
|
|
public void TestConcurrencies()
|
|
{
|
|
Concurrency(1, 1, 10);
|
|
Concurrency(1, 1, 100);
|
|
|
|
Concurrency(1, 5, 10);
|
|
Concurrency(1, 5, 100);
|
|
|
|
Concurrency(5, 5, 10);
|
|
Concurrency(5, 5, 100);
|
|
}
|
|
|
|
private void Concurrency(
|
|
int concurrencyPerWig,
|
|
int wigsCount,
|
|
int workItemsCount)
|
|
{
|
|
Console.WriteLine(
|
|
"Testing : concurrencyPerWig = {0}, wigsCount = {1}, workItemsCount = {2}",
|
|
concurrencyPerWig,
|
|
wigsCount,
|
|
workItemsCount);
|
|
|
|
_success = true;
|
|
_concurrencyPerWig = concurrencyPerWig;
|
|
_randGen = new Random(0);
|
|
|
|
STPStartInfo stpStartInfo = new STPStartInfo();
|
|
stpStartInfo.StartSuspended = true;
|
|
|
|
SmartThreadPool stp = new SmartThreadPool(stpStartInfo);
|
|
|
|
_concurrentOps = new int[wigsCount];
|
|
|
|
IWorkItemsGroup [] wigs = new IWorkItemsGroup[wigsCount];
|
|
|
|
for(int i = 0; i < wigs.Length; ++i)
|
|
{
|
|
wigs[i] = stp.CreateWorkItemsGroup(_concurrencyPerWig);
|
|
for(int j = 0; j < workItemsCount; ++j)
|
|
{
|
|
wigs[i].QueueWorkItem(new WorkItemCallback(this.DoWork), i);
|
|
}
|
|
|
|
wigs[i].Start();
|
|
}
|
|
|
|
stp.Start();
|
|
|
|
stp.WaitForIdle();
|
|
|
|
Assert.IsTrue(_success);
|
|
|
|
stp.Shutdown();
|
|
}
|
|
|
|
private object DoWork(object state)
|
|
{
|
|
int wigsIndex = (int)state;
|
|
|
|
int val = Interlocked.Increment(ref _concurrentOps[wigsIndex]);
|
|
_success = _success && (val <= _concurrencyPerWig);
|
|
|
|
int waitTime = _randGen.Next(50);
|
|
Thread.Sleep(waitTime);
|
|
|
|
val = Interlocked.Decrement(ref _concurrentOps[wigsIndex]);
|
|
_success = _success && (val >= 0);
|
|
|
|
return null;
|
|
}
|
|
}
|
|
}
|