关于事务和线程同步的理解

勤久智远 2010-04-15 05:19:25
本人对于事务和线程同步一直理解不清,所以设计了下边的问题,希望能有高人指点,设计出事务和同步机制。确保显示等差为2的数列或者为等差为3的数列



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace TestSync
{
class Program
{
static void Main(string[] args)
{
List<Thread> allThreads = new List<Thread>();
for (int i = 0; i < 100; i++)
{
Thread aThread = new Thread(new ThreadStart(Program.ThreadA));
Thread bThread = new Thread(new ThreadStart(Program.ThreadB));
Thread cThread = new Thread(new ThreadStart(Program.ThreadRead));
allThreads.Add(aThread);
allThreads.Add(bThread);
allThreads.Add(cThread);
}

foreach (Thread item in allThreads)
{
item.Start();
}
Console.ReadLine();
}

/// <summary>
/// 设置CacheA,CacheB 为等差为2的数列。
/// </summary>
static void ThreadA()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a);

CacheA.me.SetResource12(a, a + 1);
CacheA.me.SetResource12(a + 2, a + 4);
CacheB.me.SetResource12(a + 6, a + 7);
CacheB.me.SetResource23(a + 8, a + 10);
}

/// <summary>
/// 设置CacheA,CacheB 为等差为3的数列。
/// </summary>
static void ThreadB()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a);

CacheA.me.SetResource12(a, a + 2);
CacheA.me.SetResource12(a + 3, a + 6);
CacheB.me.SetResource12(a + 9, a + 7);
CacheB.me.SetResource23(a + 12, a + 15);
}

static object lockObj = new object();
static void ThreadRead()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a);

lock (lockObj)
{
//要求显示等差为2的数列或者为等差为3的数列
Console.WriteLine(CacheA.me.ToString());
Console.WriteLine(CacheB.me.ToString());
}
}

}

public class CacheA
{
/// <summary>
/// 确保CacheA实例唯一,模拟内存资源
/// </summary>
public static readonly CacheA me = new CacheA();

private int resource1 = 0;

private int resource2 = 0;

private int resource3 = 0;

private CacheA()
{

}


public void SetResource12(int val1, int val2)
{
this.resource1 = val1;
Thread.Sleep(10);
this.resource2 = val2;
Thread.Sleep(10);
}

public void SetResource23(int val2, int val3)
{
this.resource2 = val2;
Thread.Sleep(10);
this.resource3 = val3;
Thread.Sleep(10);
}


public override string ToString()
{
return string.Format("CacheA R1:{0},R2:{1},R3:{2}", resource1, resource2, resource3);
}
}

public class CacheB
{

/// <summary>
/// 确保CacheB实例唯一,模拟内存资源
/// </summary>
public static readonly CacheB me = new CacheB();

private int resource1 = 0;

private int resource2 = 0;

private int resource3 = 0;

private CacheB()
{

}

public void SetResource12(int val1, int val2)
{
this.resource1 = val1;
Thread.Sleep(10);
this.resource2 = val2;
Thread.Sleep(10);
}

public void SetResource23(int val2, int val3)
{
this.resource2 = val2;
Thread.Sleep(10);
this.resource3 = val3;
Thread.Sleep(10);
}

public override string ToString()
{
return string.Format("CacheB R1:{0},R2:{1},R3:{2}", resource1, resource2, resource3);
}
}

}

...全文
204 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
samonlyone 2010-04-30
  • 打赏
  • 举报
回复
得分,
moonwrite 2010-04-24
  • 打赏
  • 举报
回复
同步机制是为了解决同步问题的

也就是两个线程"共同"操作一个内存位置 也就是变量
如线程A还没有操作完 线程B就插了一脚
导致线程A接下去的操作失误

可以参考 C#高级编程 6版 有清晰版可以下载
hanzhongliqi 2010-04-24
  • 打赏
  • 举报
回复
能不能找个短点的,太长了
wjy217213 2010-04-24
  • 打赏
  • 举报
回复
头晕
勤久智远 2010-04-19
  • 打赏
  • 举报
回复
其实没多少东西,拷贝下来,直接运行就清楚了。
hepeng_8 2010-04-15
  • 打赏
  • 举报
回复
好害怕啊
ww20042005 2010-04-15
  • 打赏
  • 举报
回复
例子太长了,看起来真不容易。
皇城龙三 2010-04-15
  • 打赏
  • 举报
回复
太长了,帮顶一下吧
zsuswy 2010-04-15
  • 打赏
  • 举报
回复
就不能搞个短点的例子???
这么长的代码看死人的。
勤久智远 2010-04-15
  • 打赏
  • 举报
回复
对不起上边有些错误,重发。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace TestSync
{
class Program
{
static void Main(string[] args)
{
List<Thread> allThreads = new List<Thread>();
for (int i = 0; i < 100; i++)
{
Thread aThread = new Thread(new ThreadStart(Program.ThreadA));
Thread bThread = new Thread(new ThreadStart(Program.ThreadB));
Thread cThread = new Thread(new ThreadStart(Program.ThreadRead));
allThreads.Add(aThread);
allThreads.Add(bThread);
allThreads.Add(cThread);
}

foreach (Thread item in allThreads)
{
item.Start();
}
Console.ReadLine();
}

/// <summary>
/// 设置CacheA,CacheB 为等差为2的数列。
/// </summary>
static void ThreadA()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a);
try
{
CacheA.me.SetResource12(a, a + 1);
CacheA.me.SetResource23(a + 2, a + 4);
CacheB.me.SetResource12(a + 6, a + 7);
CacheB.me.SetResource23(a + 8, a + 10);
}
catch
{
}
}

/// <summary>
/// 设置CacheA,CacheB 为等差为3的数列。
/// </summary>
static void ThreadB()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a);
try
{
CacheA.me.SetResource12(a, a + 2);
CacheA.me.SetResource23(a + 3, a + 6);
CacheB.me.SetResource12(a + 9, a + 7);
CacheB.me.SetResource23(a + 12, a + 15);
}
catch
{
}
}

static object lockObj = new object();
static void ThreadRead()
{
Random r = new Random();
int a = r.Next(1000);
Thread.Sleep(a + 500);

lock (lockObj)
{
//要求显示等差为2的数列或者为等差为3的数列
Console.WriteLine(CacheA.me.ToString());
Console.WriteLine(CacheB.me.ToString());
}
}

}

public class CacheA
{
/// <summary>
/// 确保CacheA实例唯一,模拟内存资源
/// </summary>
public static readonly CacheA me = new CacheA();

private int resource1 = 0;

private int resource2 = 0;

private int resource3 = 0;

private CacheA()
{

}


public void SetResource12(int val1, int val2)
{
//模拟错误
Random r = new Random();
int a = r.Next(100);
if (a > 80)
{
throw new Exception("错误");
}

//设置值
this.resource1 = val1;
Thread.Sleep(10);
this.resource2 = val2;
Thread.Sleep(10);
}

public void SetResource23(int val2, int val3)
{
//模拟错误
Random r = new Random();
int a = r.Next(100);
if (a > 80)
{
throw new Exception("错误");
}

//设置值
this.resource2 = val2;
Thread.Sleep(10);
this.resource3 = val3;
Thread.Sleep(10);
}


public override string ToString()
{
return string.Format("CacheA R1:{0},R2:{1},R3:{2}", resource1, resource2, resource3);
}
}

public class CacheB
{

/// <summary>
/// 确保CacheB实例唯一,模拟内存资源
/// </summary>
public static readonly CacheB me = new CacheB();

private int resource1 = 0;

private int resource2 = 0;

private int resource3 = 0;

private CacheB()
{

}

public void SetResource12(int val1, int val2)
{
//模拟错误
Random r = new Random();
int a=r.Next(100);
if (a > 80)
{
throw new Exception("错误");
}

//设置值
this.resource1 = val1;
Thread.Sleep(10);
this.resource2 = val2;
Thread.Sleep(10);
}

public void SetResource23(int val2, int val3)
{
//模拟错误
Random r = new Random();
int a = r.Next(100);
if (a > 80)
{
throw new Exception("错误");
}

//设置值
this.resource2 = val2;
Thread.Sleep(10);
this.resource3 = val3;
Thread.Sleep(10);
}

public override string ToString()
{
return string.Format("CacheB R1:{0},R2:{1},R3:{2}", resource1, resource2, resource3);
}
}

}
Taiyangchen 2010-04-15
  • 打赏
  • 举报
回复
基础呀!

13,347

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET技术前瞻
社区管理员
  • .NET技术前瞻社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧