相关疑难解决方法(0)

为什么我们不能锁定值类型?

我想lock一个Boolean变量时,我遇到了以下错误:

'bool'不是lock语句所要求的引用类型

似乎在lock语句中只允许引用类型,但我不确定我理解为什么.

安德烈亚斯在评论中说:

当[值类型]对象从一个线程传递到另一个线程时,会生成一个副本,因此线程最终会处理2个不同的对象,这是安全的.

这是真的吗?这是否意味着当我执行以下操作时,我实际上在修改和方法x中的两个不同?xToTruexToFalse

public static class Program {

    public static Boolean x = false;

    [STAThread]
    static void Main(string[] args) {

        var t = new Thread(() => xToTrue());
        t.Start();
        // ...
        xToFalse();
    }

    private static void xToTrue() {
        Program.x = true;
    }

    private static void xToFalse() {
        Program.x = false;
    }
}
Run Code Online (Sandbox Code Playgroud)

(仅此代码在其状态下显然无用,仅用于示例)


PS:我知道关于如何正确锁定值类型的这个问题.我的问题与如何但与原因无关.

c# multithreading locking reference

51
推荐指数
5
解决办法
2万
查看次数

在C#中进行线程化,值类型和引用类型澄清?

在阅读了Jon Skeet 文章 和msdn的这篇文章后,我仍然有一个问题

假设我有这段代码:

  MyPerson mp = new MyPerson(); //Field

  int g=0; //Field

  public void DoWork ()
   {
      int i;
      MyPerson mp2 = new MyPerson();  
      ...
   }
Run Code Online (Sandbox Code Playgroud)

现在让我们说我有两个主题.哪个运行DoWork.(现在让我们忽略,竞争条件)

  • 他们是否会看到相同g或每个线程都有自己的项目??(价值)

  • 他们都会看到相同mp 或每个线程都有自己的项目?? (实例)

  • 他们是否会看到相同i或每个线程都有自己的项目?(价值)

  • 他们是否会看到相同mp2或每个线程都有自己的项目?(实例)

  • 如果他们都看到相同,我为什么需要static

我搜索了很多关于这个主题的内容,找不到任何文章说明:不同的主题,参考类型和价值类型...)

.net c# stack multithreading

9
推荐指数
1
解决办法
909
查看次数

使用私有变量锁定c#

根据Eric Gunnerson的说法

  • 使用锁(这个)
  • 使用锁(typeof())

Do锁定私有变量,而不是用户可以看到的内容如果需要私钥锁定,请使用"object key = new object()"

是什么原因??

c# synchronization

4
推荐指数
1
解决办法
2831
查看次数

标签 统计

c# ×3

multithreading ×2

.net ×1

locking ×1

reference ×1

stack ×1

synchronization ×1