c语⾔lock函数,c中lock的⽤法
下⾯⼩编就跟你们详细介绍下c中lock的⽤法的⽤法,希望对你们有⽤。
c中lock的⽤法的⽤法如下:
本⽂实例讲述了C#中lock的⽤法。分享给⼤家供⼤家参考。具体分析如下:
lock 关键字可以⽤来确保代码块完成运⾏,⽽不会被其他线程中断。这是通过在代码块运⾏期间为给定对象获取互斥锁来实现的。
先来看看执⾏过程,代码⽰例如下:
c++字符串是什么lock 语句⽤于获取某个给定对象的互斥锁,执⾏⼀个语句,然后释放该锁。
lock-statement:(lock 语句:)
复制代码 代码如下:
lock(expression) embedded-statement(lock ( 表达式 ) 嵌⼊语句)
lock 语句的表达式必须表⽰⼀个引⽤类型的值。永远不会为 lock 语句中的表达式执⾏隐式装箱转换,因此,如果该表达式表⽰的是⼀个值类型的值,则会导致⼀个编译时错误。
下列形式的 lock 语句:
复制代码 代码如下:
lock (x) ...
(其中 x 是⼀个引⽤类型的表达式)完全等效于
复制代码 代码如下:
(x);
try {
...
}
finally {
it(x);
}
不同的只是:实际执⾏中 x 只计算⼀次。
当⼀个互斥锁已被占⽤时,在同⼀线程中执⾏的代码仍可以获取和释放该锁。但是,在其他线程中执⾏的代码在该锁被释放前是⽆法获得它的。
⼀个类的 pe 对象可以⽅便地⽤来当作关于该类的静态⽅法的互斥锁。例如:
复制代码 代码如下:
class cache
{
public static void add(object x) {
lock (typeof(cache)) {
...
}
}
public static void remove(object x) {
lock (typeof(cache)) {
...
}
}
}
假设线程a先执⾏,线程b稍微慢⼀点。线程a执⾏到lock语句,判断obj是否已申请了互斥锁,判断依据是逐个与已存在的锁进⾏
这时假设线程b启动了,⽽线程a还未执⾏完lock⾥⾯的代码。线程b执⾏到lock语句,检查到obj已经申请了互斥锁,于是等待;直到线程a执⾏完毕,释放互斥锁,线程b才能申请新的互斥锁并执⾏lock⾥⾯的代码。
接下来说⼀些该lock什么对象。
为什么不能lock值类型,⽐如lock(1)呢?lock本质上,会使值类型装箱,每次lock的是装箱后的对象。lock 其实是类似编译器的语法糖,因此编译器直接限制住不能lock值类型。
退⼀万步说,就算能编译器允许你lock(1),但是ferenceequals(1,1)始终返回false(因为每次装箱后都是不同对象),也就是说每次都会判断成未申请互斥锁,这样在同⼀时间,别的线程照样能够访问⾥⾯的代码,达不到同步的效果。同理lock((object)1)也不⾏。
那么lock("xxx")字符串呢?msdn上的原话是:
锁定字符串尤其危险,因为字符串被公共语⾔运⾏库 (clr)“暂留”。 这意味着整个程序中任何给定字符串都只有⼀个实例,就是这同⼀个对象表⽰了所有运⾏的应⽤程序域的所有线程中的该⽂本。因此,只要在应⽤程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应⽤程序中该字符串的所有实例。
通常,最好避免锁定 public 类型或锁定不受应⽤程序控制的对象实例。例如,如果该实例可以被公开访问,则 lock(this) 可能会有问题,因为不受控制的代码也可能会锁定该对象。这可能导致死锁,即两个或更多个线程等待释放同⼀对象。出于同样的原因,锁定公共数据类型(相⽐于对象)也可能导致问题。⽽且lock(this)只对当前对象有效,如果多个对象之间就达不到同步的效果。
lock(typeof(class))与锁定字符串⼀样,范围太⼴了。
某些系统类提供专门⽤于锁定的成员。例如,array 类型提供 syncroot。许多集合类型也提供 syncroot。
⽽⾃定义类推荐⽤私有的只读静态对象,⽐如:
复制代码 代码如下:
private static readonly object obj = new object();
为什么要设置成只读的呢?这时因为如果在lock代码段中改变obj的值,其它线程就畅通⽆阻了,因为互斥锁的
对象变了,ferenceequals必然返回false。
希望本⽂所述对⼤家的C#程序设计有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论