| Printable Version
Example on Using Threads Which Are Synchronized
By Ahmad Al-Kayali
Title: Using Synchronized Threads
Author: Ahmad Al-Kayali, KFUPM
Email: a_kayali@yahoo.com
Environment: C#, Win2000, WinXP
Keywords: thread, synchronize
Level: Intermediate
Description: Example on using threads which are synchronized
Section: Threading
SubSection: General

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 form 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 soldier moves 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 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 put 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 wants to make suggestions or
discussion on anything that I can help in.
About Ahmad Al-Kayali
Ahmad Al-Kayali is currently a senior student at King Fahd University of
Petroleum and Minerals. Worked for Microsoft Arabia, Dhahran, last summer.
Completed many projects in Java, C#, VB. Have some experience in web-designing
and ASP.NET. Worked with databases in Oracle 8i and MS SQL 2000. Have some
experience in server side applications such as Exchange 2000 and ISA 2000.
|