Click here to Skip to main content
6,635,160 members and growing! (16,506 online)
Email Password   helpLost your password?
General Programming » Threads, Processes & IPC » Threads     Intermediate

Using Synchronized Threads

By Ahmad Al-Kayali

Example on using threads which are synchronized.
C#.NET 1.0, Win2K, WinXP, Dev
Posted:30 Nov 2002
Views:53,594
Bookmarked:15 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
18 votes for this article.
Popularity: 3.77 Rating: 3.00 out of 5
5 votes, 26.3%
1
3 votes, 15.8%
2
3 votes, 15.8%
3
4 votes, 21.1%
4
4 votes, 21.1%
5

Sample Image - easythread.jpg

Introduction

Threads are a powerful abstraction for allowing parallelized operations: graphical updates can happen while another thread is performing computations, two threads can handle two simultaneous network requests from a single process, and the list goes on. Since threads are pretty simple to understand, conceptually, but, practically, they are a cause for programmatic headaches, I decided to write this program to describe how to make use of threads.

Background

To understand this code completely, you need to have some basics on C# language. I used some forms and controls that are easy to understand. You can refer to the MS Visual Studio documentation to understand the System.Threading.Thread class and all its properties and methods.

Using the code

The project AutoChess.sln consists of three classes:

  1. Form1.cs
  2. King.cs
  3. Soldier.cs

This program, when executed, shows the previous grid. If one presses the (Start) button, those pieces start to move in random fashion. The King moves in any direction and the soldiers move in diagonals. Let's have a closer look at the code. We declared four threads, one for each piece:

Thread t1, t2, t3, t4;

Then, we create our four threads:

t1 = new Thread(ThreadStart(MoveWhiteKing)); 
t2 = new Thread(ThreadStart(MoveBlackKing)); 
t3 = new Thread(ThreadStart(MoveWhiteSoldier));
t4 = new Thread(ThreadStart(MoveBlackSoldier));

where MoveWhiteKing, MoveBlackKing,... are delegates that refer to methods responsible for moving the pieces. And I decided also to create an object for each piece used. Those are:

WK = new WindowsApplication1.King (bs, WhiteKingPic, WhiteSoldierPic);
BK = new WindowsApplication1.King (bs, BlackKingPic, BlackSoldierPic);
WS = new WindowsApplication1.King (bs, WhiteSoldierPic, 
                              WhiteKingPic, BlackKingPic);
BS = new WindowsApplication1.King (bs, BlackSoldierPic, 
                              BlackKingPic, WhiteKingPic);

To start the four threads, the following code is put in button1_Click(), which is the Start button:

private void button1_Click(object sender, System.EventArgs e)
{
    this.button1.Enabled = false;
    t1.Start();
    t2.Start();
    t3.Start();
    t4.Start();
}

To understand more on how each thread works, let's have a closer look at the method referenced by the delegates. Let's take the MoveWhiteKing() as an example:

private void MoveWhiteKing ()
{
    lock( synchronizeVariable ) 
    {
        while(true)
        {
            Thread.Sleep(1000);
            Monitor.PulseAll( synchronizeVariable );
            WK.MoveKing(bs);
            Monitor.Wait( synchronizeVariable );
        }
    }
}

We use the synchronizeVariable object that is assigned in the beginning of the program:

public static Object synchronizeVariable = "locking variable";

This variable is used to guarantee a certain behavior so that no two pieces move together. This is possible since there is only one thread that can grab the synchronizeVariable and, in turn, can be active at a time. Thread.Sleep(1000) causes the thread to be delayed by one second, and then the thread notifies all other threads that the synchronizeVariable is with it and no thread can take the control. The thread calls the method for moving the piece according to some defined rules. Then, the current thread puts itself into a Wait(), releasing the variable to allow other threads to grab it, and so on.

Conclusion

I hope this example will be useful for many. I noticed that there are few examples discussing threads, especially those with the synchronization characteristic. So, I tried to make this example as easy as possible to understand. I will feel glad if there is anyone who wants to make suggestions or discuss on anything that I can help in.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Ahmad Al-Kayali


Member

Location: Saudi Arabia Saudi Arabia

Other popular Threads, Processes & IPC articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 6 of 6 (Total in Forum: 6) (Refresh)FirstPrevNext
Generalnice PinmemberSameh Ahmed12:44 27 Dec '02  
GeneralRe: nice PinsussAnonymous21:36 31 Dec '02  
GeneralIntent of this example? PinmemberBurt Harris7:37 7 Dec '02  
GeneralsynchronizeVariable PinmemberBurt Harris7:31 7 Dec '02  
GeneralNot very wise PinmemberCarsten Breum0:18 4 Dec '02  
GeneralRe: Not very wise PinmemberAhmad Al-Kayali15:06 4 Dec '02  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 30 Nov 2002
Editor: Smitha Vijayan
Copyright 2002 by Ahmad Al-Kayali
Everything else Copyright © CodeProject, 1999-2009
Web17 | Advertise on the Code Project