C#中的函数如何实现事务处理或者变量锁定?

csfrank 2005-07-16 09:10:16
using System;
using System.Threading;
class test
{
private static int i=0;
public static void Add()
{
//A:start
int a=i;
Thread.Sleep(1000);
int b=i++;
Console.WriteLine("b-a={0}",b-a);
//E:end
}
public static void Main()
{
Thread[] th=new Thread[1000];
for(int j=0; j<1000; j++)
{
th[i]=new Thread(new ThreadStart(Add));
th[i].Start();
Thread.Sleep(167);
}
}

}
/* 实际运行这个程序,其输出结果如下:
b-a=0
b-a=1
b-a=2
b-a=3
b-a=4
b-a=5
b-a=5
b-a=5
b-a=5
...一直"b-a=5"下去...
...

我应当如何修改Add()函数才能使得输出结果始终为下面的样子呢?
b-a=1
b-a=1
b-a=1
b-a=1
...
b-a=1

也就是说在A:start和B:end处插入什么样的代码才能将"i"从A开始锁定,到B处释放?
在锁定期间,其他线程不得访问"i",直到释放为止。
这个有些类似于数据库中的事务处理或者表/行锁定,C#中能够做到吗?
请各位高人指点!
*/
...全文
355 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alekin 2005-07-18
  • 打赏
  • 举报
回复
using System;
using System.Threading;

namespace Test
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
Thread[] th=new Thread[1000];
for(int j=0; j<1000; j++)
{
ThreadStart ts=new ThreadStart(Add);
th[j]=new Thread(ts);
th[j].Priority=ThreadPriority.Highest;
th[j].Start();
//Thread.Sleep(1670);
}
Console.ReadLine();
}
private static int i=0;
public static void Add()
{
//A:start
int a=i;
//Thread.Sleep(1000);
int b=++i;
Console.WriteLine("b-a={0}和a={1}和b={2}",b-a,a,b);

//E:end
}
}
}
csfrank 2005-07-17
  • 打赏
  • 举报
回复
up一下:)
各位高人,给点建议阿..
csfrank 2005-07-16
  • 打赏
  • 举报
回复
我只想锁定 i
如果用lock(typeof(test))岂不是将整个test都锁住了?
这样会影响到其他的成员吧?
Ivony 2005-07-16
  • 打赏
  • 举报
回复
如果test只有一个static i
也可以:

lock ( typeof( test ) )
Ivony 2005-07-16
  • 打赏
  • 举报
回复
简单办法:


//A:start
int _i = i;
int a=i;
Thread.Sleep(1000);
int b=i++;
Console.WriteLine("b-a={0}",b-a);
i = _i;
//E:end

csfrank 2005-07-16
  • 打赏
  • 举报
回复

public static void Add()
{
lock(i)
{
int a=i;
Thread.Sleep(1000);
int b=i++;
Console.WriteLine("b-a={0}",b-a);
}
}
/*我测试了一下,这样改写是不行的,说“int不是lock语句要求的应用类型”,怎么办啊?*/
JzeroBiao 2005-07-16
  • 打赏
  • 举报
回复
学习~
listhome 2005-07-16
  • 打赏
  • 举报
回复
Lock
Monitor
方法大大的有

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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