让老人笑话的简单问题,来者有分!

乘思者 2006-01-27 03:52:34
一个变量,如何在使用的时候锁定它,防止其他的线程更改它,直到本线程认为处理结束。
Lock{}?
Monitor?

这样就可以了吗?

如何防止自己同一线程多次锁定?
不知道自己锁定了几次?
解的时候要解开该怎么办?

...全文
369 22 打赏 收藏 举报
写回复
22 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
huangkc 2006-02-13

顺便学习
  • 打赏
  • 举报
回复
MonkWang 2006-02-13
不知道 帮顶
顺便学习
  • 打赏
  • 举报
回复
是是非非 2006-02-13
不懂,帮顶

个人感觉可能是 lock
  • 打赏
  • 举报
回复
乘思者 2006-02-13
我当前的实现,大家帮我看看有什么问题没?

//多线程同步锁
bool _locked;
public object SyncRoot
{
get
{
return _dd;
}
}
public void Lock(Guid documentGuid)
{
_dd.Current=documentGuid;

System.Threading.Monitor.Enter(SyncRoot);
if(_locked)
{
System.Threading.Monitor.Exit(SyncRoot);
}
else
{
_locked=true;
}
}

public void Unlock()
{
System.Threading.Monitor.Exit(SyncRoot);
System.Threading.Monitor.Exit(SyncRoot);
System.Threading.Monitor.Exit(SyncRoot);
_locked=false;
}

public bool Locked
{
get
{
return _locked;
}
}
  • 打赏
  • 举报
回复
冰河zyc 2006-02-06
没用过
帮顶
  • 打赏
  • 举报
回复
califord 2006-02-05
lock是在golbal.aspc页里的呀
  • 打赏
  • 举报
回复
乘思者 2006-02-04
我的原因是这样的:

我的一个类的一个目的有多种操作方式,而这几种操作方式是实施这个目的的不同步骤地入口,如果我锁定了,那么后面的步骤不知道前面的步骤已经锁定了,还会继续锁定(同一线程多次锁定),如果我不锁定,那样就会被其他线程更改掉。
  • 打赏
  • 举报
回复
qiyu20031022 2006-01-29
不懂,来学习.
  • 打赏
  • 举报
回复
LixingTie 2006-01-29
greenery好厉害,我也是来抢分的,嘿嘿
  • 打赏
  • 举报
回复
broadury 2006-01-29
学习……
dot net中好像有相应的锁类
  • 打赏
  • 举报
回复
zhy0101 2006-01-28
同一线程的代码是顺序执行的,可以避免多次lock
  • 打赏
  • 举报
回复
handsome0916 2006-01-28
不要将解锁放在阻塞的循环之外,执行完要立即解锁.要不是就会出现死锁.
假如要用多个锁,可以锁定几个不同的变量,这样就不会不同的锁间互相干侥
  • 打赏
  • 举报
回复
代码蜗牛sky 2006-01-27
lock
  • 打赏
  • 举报
回复
greenery 2006-01-27
按你的要求,可以在线程执行的函数中,一开始就开始锁定
在以下例子中,线程函数Withdraw在开始计算前,先将对将自己锁定,防止其他线程对其变量balance修改。

using System;
using System.Threading;

class Account
{
int balance;

Random r = new Random();

public Account(int initial)
{
balance = initial;
}

int Withdraw(int amount)
{

// This condition will never be true unless the lock statement
// is commented out:
if (balance < 0)
{
throw new Exception("Negative Balance");
}

// Comment out the next line to see the effect of leaving out
// the lock keyword:
lock (this)
{
if (balance >= amount)
{
Console.WriteLine("Balance before Withdrawal : " + balance);
Console.WriteLine("Amount to Withdraw : -" + amount);
balance = balance - amount;
Console.WriteLine("Balance after Withdrawal : " + balance);
return amount;
}
else
{
return 0; // transaction rejected
}
}
}

public void DoTransactions()
{
for (int i = 0; i < 100; i++)
{
Withdraw(r.Next(1, 100));
}
}
}

class Test
{
public static void Main()
{
Thread[] threads = new Thread[10];
Account acc = new Account (1000);
for (int i = 0; i < 10; i++)
{
Thread t = new Thread(new ThreadStart(acc.DoTransactions));
threads[i] = t;
}
for (int i = 0; i < 10; i++)
{
threads[i].Start();
}
}
}


另一个例子
class MyClass
{
public static int ItemCount = 0;
}

class 线程1
{
public void AddItem()
{
lock(MyClass.ItemCount)
{
list.Add(...);
MyClass.ItemCount++;
}
}
}
class 线程2
{
public void RemoveItem()
{
lock(MyClass.ItemCount)
{
list.Remove(...);
MyClass.ItemCount--;
}
}
}
  • 打赏
  • 举报
回复
hotnoodle 2006-01-27
学习,接分
  • 打赏
  • 举报
回复
raulredondo 2006-01-27
不知道,学习,接分
  • 打赏
  • 举报
回复
什么叫跨方法???
  • 打赏
  • 举报
回复
wdszya 2006-01-27
不知道,学习,接分
  • 打赏
  • 举报
回复
乘思者 2006-01-27
如果我的进程要跨方法运行呢?
  • 打赏
  • 举报
回复
xldlm 2006-01-27
lock
出了"}"自动解除
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
暑假期间留校与两名队友一起参加广东省大学生电子设计竞赛“健康电子”主题的比赛,经过两个月不懈努力,功夫不负有心人,作品也获得了广东省一等奖,现在将作品分享出来跟大家一起交流,也希望大家能多多给出修改意见。 “孤寡老人的健康监测仪”作品主要由一个可佩带的手表和一个手机APP组成,另外还有一个测血压的外接设备,手表的外壳是通过3D打印完成的。 我们的作品的想法是,孤寡老人在家里只需要带着手表,而家人在外面通过APP就可以对老人进行事实监测,手表对于老人来说并不需要进行任何操作,可以把它当成一个正常的手表来使用。 我将把所有源码和原理图分享出来。 作品采用的STM32F405作为主控芯片,没有任何外部扩展FLASH或者SRAM 作品的功能有: 1.测心率、体温和血压 2.测摔倒并报警 3.链接WIFI 4.提醒吃药 5.钟表功能 6.电容触摸,手势滑动,手势解锁,翻腕解锁等 7.体征异常报警功能 8.一键开关机,一键解锁 9.电量监测 硬件组成: 1. 1.54寸 240*240分辨率LCD显示屏 2. 1.54寸电容触摸屏 3. MPU6050 4.有人网络的WIFI模块 5.MXL90615温度传感器 6.SON7015心率传感器 7.TP4056电源芯片 主要软件的内容: 1.系统采用UCOS/II 2.界面使用的是EmWin 3.手机APP和服务器,使用的是JAVA编写 总体介绍内容介绍:整个手表端的设计,为了追求手表体积的尽可能小,除了WIFI模块外,其他地方都没有使用任何现成模块,元器件的规格也都是最小规格的,外观是通过3D打印来弄的。一些底层程序是直接用原子哥的,上层大多数是根据在自己的需求写的。 网络部分:手表上的WIFI链接是使用smartlink功能,通过手机APP来进行链接的,与服务器通信部分采用的websocket协议,实现了全双工实时通信。服务器是买的,其中websocket协议当时做的时候几乎找不到有在单片机上实现的资料,所以都是自己一点一点试出来的。 体征测量部分:心率部分由于传感器的问题,测量条件有点苛刻,干扰对其的影响较大,我们通过示波器观察规律,编写滤波算法将心率测量结果尽可能的稳定。 体温监测,数据并没有做什么特殊处理,实际使用过程中发现体温测量受环境影响较大。 血压测量,血压是通过一个独立于手表之外的设备进行测量的,设备由手表控制,并把测量数据返回到手表,由于手表上已经有一个WIFI了,因此血压与手表的数据传输直接使用了WIFI进行传输。 测摔倒功能,测摔倒算法是自己编写的,原理并不复杂,但是效果还是很不错的(误判少),主要是通过监测加速度值来判断是否摔倒的。 体征测量中,心率和体温是可以主动和被动进行的,手边会每过一段时间自己检测一次,或者通过按钮实现一次测量,测量会持续30s,30s内一旦测量成功就终止测量。 屏幕和显示:屏幕我们是在淘宝上买的1.54寸240*240分辨率的LCD屏幕,由于考虑到老人的使用问题,我们后来又找了一款1.54寸的电容触摸屏,通过工业双面胶将两者贴合在一起,本来想购买已经贴合好的,无奈淘宝上几乎没人卖我们想要的。 手表主要由三个界面,1.时钟界面 2.测量界面 3.WIFI链接界面 整个手表上只有一个开关机和解锁屏的按键,界面内容里也是没有操作按键的,因此界面的切换就需要通过手势来判断,触摸芯片是有支持手势功能的,无奈不知道为何一直打开不了那个功能,后来没办法只能直接编写算法实现手势操作功能,主要的手势功能有1.向左右切换界面 2.向上下进行锁屏和解锁 界面使用的是emwin5.28版的,用的功能都是一些最基础的功能。 手表还可以实现翻腕解锁功能,这里是通过MPU6050解算出欧拉角实现的。 触摸屏上刚好有一个小孔,我们在那里装了一个光敏电阻,用来实现屏幕的亮度自动调节。 报警功能:通过手机APP设置报警功能后,一旦手表判断体征异常就会发出报警震动,当佩戴者点击确定后,手机APP端会自动报警。为了防止误判,体征异常是否发出报警信息这里需要点击确定或者取消。当佩戴者一定时间内都没有点击确认或者取消时,手表会认为佩戴者已经无法正常操作,并自动向APP发送报警信 息,通知手机端。 手边还有提醒吃药功能,使用者通过使用手机APP可以设置3个吃药时间点,一旦时间点到了之后,手表就会自动发出吃药提醒。 用户管理: 手机APP通过扫描手表上的二维码与手机进行绑定,手机APP也需要进行注册才可以进行登录。一个手机只可以操控一个手表。 错误处理:以上的功能很多都是基于网络链接,但是网络链接有时候并不是很稳定的,因此我们在编写软件的过程中也着重对这一块进行了处理,但发生断开连接时,手表会自动进行重连,当重连失败时,手边会重启WIFI模块再进行尝试,并且提示佩戴者,当前已经
发帖
C#
加入

10.7w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
申请成为版主
帖子事件
创建了帖子
2006-01-27 03:52
社区公告

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