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