关于Lock的用法

takpod 2015-01-16 10:09:35

我想在线程中这样调用函数而不相互干扰 可以吗?

public int  Function(int a,int b)
{
object lockThis = new object ();
int c;
lock (lockThis)
{
c=a+b;
}
return c;
}
...全文
256 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
_lee_chong 2015-02-04
  • 打赏
  • 举报
回复
引用 13 楼 takpod 的回复:
[quote=引用 12 楼 willhuo 的回复:] 除非线程处理模块有公用的资源,这样才能够使用lock,对公用资源进行锁定,一个线程用完了,另外一个线程接着用 锁定资源可以直接初始化一个object对象,需要全局的,然后线程内部锁定这个对象,开始干活,干完活,释放这个对象,等着下一个线程锁定。。
 lock (lockThis)
    {
        c=Funtion();//如果Funtion()是外部函数就要lock对不对?
    }
[/quote] 锁不锁是看需求的,只有当多线程会有冲突才需要诶;

 static   int c;
 static readonly object  lockThis  =new object();
public void Function(int a,int b)
{
    lock (lockThis)
    {
        c=a+b; // 多线程对一个全局变量做写入操作,此时才会有冲突可能诶
    } 
}
於黾 2015-02-04
  • 打赏
  • 举报
回复
引用 13 楼 takpod 的回复:
[quote=引用 12 楼 willhuo 的回复:] 除非线程处理模块有公用的资源,这样才能够使用lock,对公用资源进行锁定,一个线程用完了,另外一个线程接着用 锁定资源可以直接初始化一个object对象,需要全局的,然后线程内部锁定这个对象,开始干活,干完活,释放这个对象,等着下一个线程锁定。。
 lock (lockThis)
    {
        c=Funtion();//如果Funtion()是外部函数就要lock对不对?
    }
[/quote] 我觉得你还是从计算机基础开始学起吧 这跟函数放哪里有任何关系?
  • 打赏
  • 举报
回复
你看一下生产者与消费者这个经典的线程协调的程序。
於黾 2015-02-04
  • 打赏
  • 举报
回复
函数不是对象 变量才是对象
shushangdeyezi 2015-02-04
  • 打赏
  • 举报
回复
一句话,当多个线程需要同时访问一个对象的时候会出错,这时候就需要排队,然后就是LOCK
xk280399649 2015-02-03
  • 打赏
  • 举报
回复
你这样每一个 function的类都有一个 类对象,每一个类对象里面都有一个lockThis,岂不是失去作用了
takpod 2015-01-30
  • 打赏
  • 举报
回复
引用 12 楼 willhuo 的回复:
除非线程处理模块有公用的资源,这样才能够使用lock,对公用资源进行锁定,一个线程用完了,另外一个线程接着用 锁定资源可以直接初始化一个object对象,需要全局的,然后线程内部锁定这个对象,开始干活,干完活,释放这个对象,等着下一个线程锁定。。
 lock (lockThis)
    {
        c=Funtion();//如果Funtion()是外部函数就要lock对不对?
    }
willhuo 2015-01-17
  • 打赏
  • 举报
回复
除非线程处理模块有公用的资源,这样才能够使用lock,对公用资源进行锁定,一个线程用完了,另外一个线程接着用 锁定资源可以直接初始化一个object对象,需要全局的,然后线程内部锁定这个对象,开始干活,干完活,释放这个对象,等着下一个线程锁定。。
devmiao 2015-01-16
  • 打赏
  • 举报
回复
每个线程有自己的堆栈,堆栈上的变量不要同步
john_QQ:2335298917 2015-01-16
  • 打赏
  • 举报
回复
不用lock,不需要锁
  • 打赏
  • 举报
回复
lock第一点就是要保证你这个东西多个线程之间都可以识别,你这样在方法内写这样有啥用,只有每个线程才认识这个object 就跟楼上说的,你这个得放到全局变量里面,至于是否需要static,或者说是否可以static,看你实际设计,我就设计过只能绝对不能static的,因为设计中这个类虽然不是单例,但它是被其它单例类包含的,所以只能非static的object
frankbiao 2015-01-16
  • 打赏
  • 举报
回复
引用 5 楼 takpod 的回复:
[quote=引用 1 楼 bdmh 的回复:] object lockThis = new object ();这个不行,要放到全局,而且最好是static的
object lockThis = new object (); 就算这个该为全局的也不行吧! 如果 线程1调用Function(1,2)到如下部份 lock (lockThis) { c=a+b; } 但如果此时线程2调用Function(2,3);会不会此时已经更改a和b的值 使线程1 返回c=2+3 而不是 c=1+2呢? [/quote] 线程1调用Function 时int 一个c 线程2 调用Function时又int 一个c所以线程1和2是不影响的
於黾 2015-01-16
  • 打赏
  • 举报
回复
比如 lock(a){过程1} lock(a){过程2} lock(b){过程3} lock(b){过程4} 过程1和2不能多线程同时执行,需要排队 过程3和4不能同时执行 前提是a和b需要是全局变量或静态变量,否则每进入方法都实例化一次,虽然名字相同,但是其实不是一个东西
於黾 2015-01-16
  • 打赏
  • 举报
回复
放到全局或者改为静态 总之就是互相需要排队的过程,要lock同一个对象
bdmh 2015-01-16
  • 打赏
  • 举报
回复
object lockThis = new object ();这个不行,要放到全局,而且最好是static的
於黾 2015-01-16
  • 打赏
  • 举报
回复
你的例子里没有任何需要lock的地方 1.首先a和b是参数传递进来的,并不是直接使用a和b的地址 2.对a和b只有取值,没有赋值 3.变量c是个局部变量,两个线程同时执行,并不是同一个c
timelight2000 2015-01-16
  • 打赏
  • 举报
回复
当然不会。public int Function(int a,int b) a和b是参数,每次调用时传值进来,两次调用function是不会相互影响的。 你的例子里应该都不需要lock呀。
public int  Function(int a,int b)
{
    int c;
    c=a+b;
    return c;
}
应该是不会报错的。
takpod 2015-01-16
  • 打赏
  • 举报
回复
引用 2 楼 Z65443344 的回复:
放到全局或者改为静态 总之就是互相需要排队的过程,要lock同一个对象
object lockThis = new object ();该为全局 如果 线程1调用Function(1,2)到如下部份 lock (lockThis) { c=a+b; } 但如果此时线程2调用Function(2,3);会不会此时已经更改a和b的值 使线程1 返回c=2+3 而不是 c=1+2呢? 你怎么看
takpod 2015-01-16
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
object lockThis = new object ();这个不行,要放到全局,而且最好是static的
object lockThis = new object (); 就算这个该为全局的也不行吧! 如果 线程1调用Function(1,2)到如下部份 lock (lockThis) { c=a+b; } 但如果此时线程2调用Function(2,3);会不会此时已经更改a和b的值 使线程1 返回c=2+3 而不是 c=1+2呢?

110,536

社区成员

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

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

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