Introduction
The purpose of this code is to demonstrate how new TPL (Task Parallel Library) of .NET 4 utilize available multi core.<o:p>
Background
Before TPL we have to do thread management. But now that responsibility is taken by TPL.<o:p>
We still have to deal with data integrity (such as critical section data race and deadlock), but at least bigger part is taken from our shoulder.
The Parallel
class is defined under the System.Threading.Tasks
namespace
and the following code demo shows the benefits of using the Parallel
class if you want to use multi-threading.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Threads
{
class Program
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern int GetCurrentProcessorNumber();
private static int criticalSection = 0;
private static object lockObject = new object();
static void Main(string[] args)
{
Console.WriteLine("==================Sequential calls==============");
Console.WriteLine();
int numberOfProcessors = Environment.ProcessorCount;
for (int i = 0; i < numberOfProcessors; i++)
{
Target();
}
Console.WriteLine();
Console.WriteLine("==================Parallel calls==============");
Console.WriteLine();
Action action = new Action(Target);
List<Action> parallelTaskList = new List<Action>();
for (int i = 0; i < numberOfProcessors; i++)
{
parallelTaskList.Add(action);
}
Parallel.Invoke(parallelTaskList.ToArray());
Console.WriteLine("Finished");
Console.ReadKey();
}
private static void Target()
{
Thread.Sleep(2000);
lock (lockObject)
{
criticalSection++;
Console.WriteLine(string.Format("Thread ID: {0} and Processor ID: {1} Critical Variable Value: {2}", Thread.CurrentThread.ManagedThreadId, GetCurrentProcessorNumber(), criticalSection));
}
}
}
}