gpt4 book ai didi

multithreading - .NET 线程面试问题

转载 作者:行者123 更新时间:2023-12-04 09:12:48 24 4
gpt4 key购买 nike

你能描述两种同步多线程写访问的方法吗?
在类(class)成员身上?

请任何人都可以帮助我这是什么意思,什么是正确的答案。

最佳答案

当您在 C# 中更改数据时,看起来像单个操作的内容可能会被编译为多个指令。参加以下类(class):

public class Number {
private int a = 0;
public void Add(int b) {
a += b;
}
}

构建它时,您将获得以下 IL 代码:
IL_0000:  nop
IL_0001: ldarg.0
IL_0002: dup
// Pushes the value of the private variable 'a' onto the stack
IL_0003: ldfld int32 Simple.Number::a
// Pushes the value of the argument 'b' onto the stack
IL_0008: ldarg.1
// Adds the top two values of the stack together
IL_0009: add
// Sets 'a' to the value on top of the stack
IL_000a: stfld int32 Simple.Number::a
IL_000f: ret

现在,假设您有一个 Number对象和两个线程调用它的 Add像这样的方法:
number.Add(2); // Thread 1
number.Add(3); // Thread 2

如果你希望结果是 5 (0 + 2 + 3),那就有问题了。你不知道这些线程什么时候会执行它们的指令。两个线程都可以执行 IL_0003 (将零压入堆栈)在执行 IL_000a 之前(实际上改变成员变量),你会得到这个:
a = 0 + 2; // Thread 1
a = 0 + 3; // Thread 2

完成“获胜”的最后一个线程,在进程结束时, a是 2 或 3 而不是 5。

因此,您必须确保一组完整的指令在另一组指令之前完成。为此,您可以:

1) 使用众多 .NET synchronization primitives 之一,在编写类成员时锁定对它的访问。 (如 lock Mutex ReaderWriterLockSlim 等)以便一次只能有一个线程处理它。

2)将写操作插入队列并使用单个线程处理该队列。正如 Thorarin 指出的那样,如果队列不是线程安全的,您仍然需要同步对队列的访问,但对于复杂的写操作来说这是值得的。

还有其他技术。有些(如 Interlocked )仅限于特定的数据类型,还有更多(如 Non-blocking synchronizationPart 4 of Joseph Albahari's Threading in C# 中讨论的那些),尽管它们更复杂:谨慎处理它们。

关于multithreading - .NET 线程面试问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2117364/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com