Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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_Volatile - Fatal编程技术网

C# 如果一个方法在不同的线程上执行,但不是并发的,那么它需要是易失性的吗?

C# 如果一个方法在不同的线程上执行,但不是并发的,那么它需要是易失性的吗?,c#,multithreading,volatile,C#,Multithreading,Volatile,在上面的代码中,TimeCallback运行得非常快,它不能在计时器间隔期间并发运行。所以我知道它是原子的,不需要lock() 我的问题是,i可以是非易失性的,还是必须像j一样是易失性的 如果i必须是易失性的,那么akka actor字段如何可以是非易失性的 如果只有一个线程(主线程除外)使用某些变量,并且我们确信它永远不会被另一个线程使用,这就像是单线程,因此我们不需要处理并发和同步(锁定、易失性、监视…) 我们唯一能做的,也应该做的,就是确保我们分离代码,使用好的命名和专用类 例如: usi

在上面的代码中,TimeCallback运行得非常快,它不能在计时器间隔期间并发运行。所以我知道它是原子的,不需要
lock()

我的问题是,
i
可以是非易失性的,还是必须像
j
一样是易失性的

如果
i
必须是易失性的,那么akka actor字段如何可以是非易失性的


如果只有一个线程(主线程除外)使用某些变量,并且我们确信它永远不会被另一个线程使用,这就像是单线程,因此我们不需要处理并发和同步(锁定、易失性、监视…)

我们唯一能做的,也应该做的,就是确保我们分离代码,使用好的命名和专用类

例如:

using System;
using System.Threading;

class Program
{
    private static int i = 0;
    private static volatile int j = 0;

    static void Main(string[] args)
    {
        Timer timer = new Timer(TimeCallback, null, 1000, 60 * 1000);


        Console.ReadLine();
    }

    private static void TimeCallback(object state)
    {
        i++;
        if (i > 10000 * 10000)
        {
            i = 0;
        }

        j++;
        if (j > 10000 * 10000)
        {
            j = 0;
        }


        Console.WriteLine(i + "," + j);
    }
}
但是线程之间使用和共享的任何内容都需要根据需要进行管理,即使是一般的读数

因此,如果多个线程可以同时调用计时器回调,那么确实需要管理并发和同步,因为它是多线程的


您编写了“它不能在计时器间隔期间并发运行”和“计时器回调在线程池上执行,它可能在不同的线程上运行”:因此,永远不要假设“TimeCallback运行得很快”之类的内容

因此,你应该以干净、坚固、标准的方式来做这些事情。因此,您将避免基本问题和偶尔的随机崩溃或冻结


计时器回调在线程池上执行,它可能在不同的线程上运行。@lcm这会改变一些事情。答案已更新。
class Program
{
  static void Main(string[] args)
  {
    Timer timer = new Timer(MyIsolatedThreadedProcessing.DoProcess, null, 1000, 60 * 1000);
    Console.ReadLine();
  }
}

static public class MyIsolatedThreadedProcessing
{
  static private int Value1 = 0;
  static private int Value2 = 0;
  static public void DoProcess(object state)
  {
    Value1++;
    if ( Value1 > 10000 * 10000 )
    {
      Value1 = 0;
    }
    Value2++;
    if ( Value2 > 10000 * 10000 )
    {
      Value2 = 0;
    }
    Console.WriteLine(Value1 + "," + Value2);
  }
}