Avoiding Reading and Writing Data C# with Example



Avoiding Reading and Writing Data C# with Example

Simultaneously 
Sometimes, you want your threads to simultaneously share data. When this happens it is important to be aware of 
the code and lock any parts that could go wrong. A simple example of two threads counting is shown below. 
Here is some dangerous (incorrect) code: 
using System.Threading; 
class MainClass 
{ 
static int count { get; set; } 
static void Main() 
{ 
for (int i = 1; i <= 2; i++) 
{ 
var thread = new Thread(ThreadMethod); 
thread.Start(i); 
Thread.Sleep(500); 
} 
} 
static void ThreadMethod(object threadNumber) 
{ 
while (true) 
{ 
var temp = count; 
System.Console.WriteLine("Thread " + threadNumber + ": Reading the value of count."); 
Thread.Sleep(1000); 
count = temp + 1; 
System.Console.WriteLine("Thread " + threadNumber + ": Incrementing the value of count 
to:" + count); 
Thread.Sleep(1000); 
} 
} 
} 
You'll notice, instead of counting 1,2,3,4,5... we count 1,1,2,2,3... 
To fix this problem, we need to lock the value of count, so that multiple different threads cannot read and write to 
it at the same time. With the addition of a lock and a key, we can prevent the threads from accessing the data 
simultaneously. 
using System.Threading; 
class MainClass 
{ 
static int count { get; set; } 
static readonly object key = new object(); 
static void Main() 
{ 
for (int i = 1; i <= 2; i++) 
 

{ 
var thread = new Thread(ThreadMethod); 
thread.Start(i); 
Thread.Sleep(500); 
} 
} 
static void ThreadMethod(object threadNumber) 
{ 
while (true) 
{ 
lock (key) 
{ 
var temp = count; 
System.Console.WriteLine("Thread " + threadNumber + ": Reading the value of 
count."); 
Thread.Sleep(1000); 
count = temp + 1; 
System.Console.WriteLine("Thread " + threadNumber + ": Incrementing the value of 
count to:" + count); 
} 
Thread.Sleep(1000); 
} 
} 
} 

0 Comment's

Comment Form

Submit Comment