【问题标题】:C# lock does not make my variable private [closed]C#锁不会使我的变量私有[关闭]
【发布时间】:2016-12-10 20:42:36
【问题描述】:

我需要为每个线程保持我的变量“计数器”私有。

我尝试使用:

object locker = new object();
private object locker = new object(); 
private static readonly object locker = new object();

但它们都不起作用。

我还有其他方法可以解决这个问题吗?

这是我的代码。

public partial class Form1 : Form
{

    int counter = 0;
    private static readonly object locker = new object();
    public Form1()
    {
        InitializeComponent();
        Task t1 = new Task(() =>
        {
            func();
        });
        Task t2 = new Task(() =>
        {
            func();
        });
        // two threads
        t1.Start();
        t2.Start();
    }

    void func()
    {
        lock (locker)
        {
            counter++;
            Console.Write(counter + " "); // prints "1 2"
                                          // it should print "1 1"
        }
    }
}

【问题讨论】:

  • 有什么理由不能将counter 移动到func 内部?
  • 线程锁定变量不是问题。这正是预期的输出 - 您刚刚使 counter 变量线程安全。它一次只能增加一个线程,这就是它给出1 2 的原因。如果你删除你的保护措施(即lock(..)),输出将变得不可预测并且可能输出1 1,因为现在两个线程可能同时读取和写入同一个变量。 counter 是相对于类的全局变量,而不是线程局部变量。
  • @MaximilianGerhardt 我认为您的意思是类级别的变量。 C# 没有全局变量。
  • 不清楚你想实现什么。事实上lock 不会使变量private 因为这两个概念之间没有关系...

标签: c# multithreading parallel-processing locking


【解决方案1】:

看看这个链接https://msdn.microsoft.com/en-us/library/system.threading.thread.priority(v=vs.110).aspx

[ThreadStatic]
static long threadCount = 0;

我想这会对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 2020-02-08
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多