Click here to Skip to main content
Click here to Skip to main content

Multi-threading in .NET 4

, 11 Apr 2012 CPOL
Rate this:
Please Sign up or sign in to vote.
Huge improvement on Multithreading in new Task Parallel Library for .NET 4

Introduction

The purpose of this code is to demonstrate how new TPL (Task Parallel Library) of .NET 4 utilize available multi core.

Background

Before TPL we have to do thread management. But now that responsibility is taken by TPL.

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();
            
            // Get the number of processor.
            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>();

            // Create equal number of task as number of processor. I hope each thread will execute in seperate processor. We will find out.
            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));
            }

        }

    }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Tony Dubey

United States United States
No Biography provided

Comments and Discussions

 
QuestionC# Parallel.For multi thread parallel Pinmemberytyet20058-Oct-14 15:30 
QuestionMight be nice to put some timings in the output Pinmemberkevinbrydon12-Apr-12 0:03 
QuestionWhy are you using WinAPI to get a number of processors? PinmemberLaserson9-Apr-12 19:49 
AnswerRe: Why are you using WinAPI to get a number of processors? PinmemberJohn Brett9-Apr-12 22:49 
GeneralRe: Why are you using WinAPI to get a number of processors? Pinmemberdaylightdj12-Apr-12 6:11 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.141223.1 | Last Updated 12 Apr 2012
Article Copyright 2012 by Tony Dubey
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid