Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能用C#把(某物)锁在一行上吗?_C#_Multithreading_Syntax_Locking - Fatal编程技术网

我能用C#把(某物)锁在一行上吗?

我能用C#把(某物)锁在一行上吗?,c#,multithreading,syntax,locking,C#,Multithreading,Syntax,Locking,下面的_otherThing字段是否会受到锁的保护 class ThreadSafeThing { private readonly object _sync = new object(); private SomeOtherThing _otherThing; public SomeOtherThing OtherThing { get { lock(_sync) return _otherThing; } } public void UpdateOthe

下面的_otherThing字段是否会受到锁的保护

class ThreadSafeThing
{
    private readonly object _sync = new object();

    private SomeOtherThing _otherThing;

    public SomeOtherThing OtherThing { get { lock(_sync) return _otherThing; } }

    public void UpdateOtherThing(SomeOtherThing otherThing)
    {
        lock(_sync) _otherThing = otherThing;
    }
}
这种结构:

lock(_sync) _otherThing = otherThing;
lock(_sync)
{
    _otherThing = otherThing;
}
…与此结构相同:

lock(_sync) _otherThing = otherThing;
lock(_sync)
{
    _otherThing = otherThing;
}

因此,是的,
\u otherThing
的分配受锁保护。

是的,它将受到保护,因为
\u sync
对象不会更改

编辑:您在这里使用的锁几乎肯定不是您的意思,如本帖中其他几个答案所述。

是的

这与锁无关。C#程序使用语句表示。使用{}将多个语句分组为一个块。块可以在允许使用单个语句的上下文中使用。参见C语言规范第1.5节

据我所知

lock(_sync)
  _otherThing = otherThing;

lock(_sync) _otherThing = otherThing;
lock(_sync)
{
  _otherThing = otherThing;
}
if(something)
{
  _otherThing = otherThing;
}

lock(_sync) _otherThing = otherThing;
lock(_sync)
{
  _otherThing = otherThing;
}
if(something)
{
  _otherThing = otherThing;
}
类似于

if(something)
  _otherThing = otherThing;
这和

lock(_sync) _otherThing = otherThing;
lock(_sync)
{
  _otherThing = otherThing;
}
if(something)
{
  _otherThing = otherThing;
}
(我所说的相似是指语法上的相似,而不是功能上的相似。
if
lock
当然不一样:p)


实际上,您可以使用
{}
,即使没有
锁、
if
或任何类似于group语句的语句。

您的代码在处理引用时不是线程安全的

除非锁阻止的唯一事情是返回对对象的引用(没有锁的线程安全,请参见C语言规范第5.5节),否则您不会对“其他线程安全”进行更改


在此实例中,您需要使您的变体和访问器线程安全(通过锁定对象的更改和读取)

那就行了。单语句和块语句在C#语法中几乎总是可以互换的(除了方法体之类的)

但是,甚至可能根本不需要进行锁定。如果要防止在进行其他更改时更改属性,请选择“是”。如果
SomeOtherThing
是值类型(
struct
),您还需要锁定它


如果您选择不使用锁,则需要声明字段,以确保您的更改立即在其他线程中可见。

@280Z28:如果其他对象是
结构,则分配可能不是原子的。谢谢。我的例子很琐碎,只是为了便于提问。@Fredrik:我真不敢相信我错过了这个例子。32位机器上的
double
long
也是如此。谢谢。其他东西也可以是值类型,但我不是问如何锁定东西,我只是问语法。其他东西也可以是不可变的。不过,就内存模型而言,锁还有另一个用途。乔恩,你想详细说明一下吗?我明白如果你的类型是不可变的,那么是的,你可以给出引用而不用担心。你指的是什么记忆模型效应?如果您处理的是引用类型,实际上是5.5中描述的许多值类型,那么您有线程安全赋值和读取,锁定只会减慢您的速度。@Spence:赋值是原子的,但不是线程安全的-除非您包含“无法保证读取线程会看到另一个线程写入的新值”线程安全。您需要字段是易失性的,或者具有其他内存障碍(包括锁)。啊,您当然指的是缓存值。所以,您需要设置内存屏障或锁定,以便将该引用从缓存中刷新到所有处理器上的主内存。并发编程很有趣。。。顺便说一句,为您的回复干杯。或者如果您想确保您的更改被其他线程看到。。。一般来说,在读取或更新共享内存时,您需要某种内存屏障,以确保适当的可见性。
volatile
应该可以做到这一点。我想添加它,但iPhone3.0软件上的Safari确实不喜欢堆栈溢出。好了:p感谢解释答案。类、函数、枚举等定义需要块。尝试、捕捉并最终需要块。所以块和语句并不是完全可以互换的。@ChadSchouggins我并没有说它们可以互换。我说过,一个块可以在允许一条语句的地方使用,这就是语言规范所说的。