Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# 本地对象变量上没有volatile,但每个线程写入不同的属性-这安全吗?_C#_.net_Thread Safety - Fatal编程技术网

C# 本地对象变量上没有volatile,但每个线程写入不同的属性-这安全吗?

C# 本地对象变量上没有volatile,但每个线程写入不同的属性-这安全吗?,c#,.net,thread-safety,C#,.net,Thread Safety,鉴于twooitems是一个局部变量,并且没有使用volatile关键字或任何锁或内存障碍,此代码安全吗?我认为这仍然是因为一个线程设置了First属性,而第二个线程设置了second属性,但我想确定一下。如果此代码不可靠且可能无法工作,请建议在此上下文中的最佳修复方法 private void Method() { var twoItems = new TwoItems(); Action getFirstItem = () => { Thread

鉴于
twooitems
是一个局部变量,并且没有使用
volatile
关键字或任何锁或内存障碍,此代码安全吗?我认为这仍然是因为一个线程设置了
First
属性,而第二个线程设置了
second
属性,但我想确定一下。如果此代码不可靠且可能无法工作,请建议在此上下文中的最佳修复方法

private void Method()
{
    var twoItems = new TwoItems();
    Action getFirstItem = () =>
    {
        Thread.Sleep(2000);
        twoItems.First = new Item { SomeInt = 1, SomeString = "1" };
    };
    Action getSecondItem = () =>
    {
        Thread.Sleep(2000);
        twoItems.Second = new Item { SomeInt = 2, SomeString = "2" };
    };
    Task.WaitAll(
        Task.Factory.StartNew(getFirstItem),
        Task.Factory.StartNew(getSecondItem));
    Console.WriteLine(twoItems.First.SomeString
        + twoItems.Second.SomeString);
}

class TwoItems
{
    public Item First { get; set; }
    public Item Second { get; set; }
}

class Item
{
    public int SomeInt { get; set; }
    public string SomeString { get; set; }
}

所讨论的代码不属于“线程安全”问题,因为线程安全特别是关于多个线程如何与同一数据交互

由于您的代码不与相同的数据交互,因此它并不完全属于该问题

这里的共享对象是具有这两个属性的对象,但在这种情况下这不会带来任何问题


因此,代码将不会有竞争条件、锁定问题或缺少锁的问题,因此将按预期运行。

您所说的“线程安全”是什么意思?一般来说,这绝对不符合线程安全的条件。你是专门问这个场景吗?@YuvalItzchakov-我知道我刚刚编辑了这个问题。我的意思是:这个多线程代码安全吗?
方法将仅从一个线程调用。@Aron-您能详细说明一下吗?所讨论的代码将不会有任何竞争条件或锁定(或缺少)问题,因此将“安全”地执行。没有问题,.NET内存模型承诺此代码可以工作。CLR通过提供内存对齐保证来实现,这样处理器就不必执行可能更新多个变量占用的内存的总线循环。如果没有这种保证,编写线程化代码是不可能的,因为错误对齐的更新可能会影响完全不同的对象的状态。“由于您的代码不与相同的数据交互”,代码共享对
twooitems
的读取,因此我们可以说它“交互”。好吧,它读取
twooitems
引用,当然,我不同意你的结论。只是觉得措辞可能会稍微调整一下。