Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-16 04:45:50

好的!以下是一道专家级别的 C# 程序员逻辑面试题,涉及多线程、并发和性能优化等高级主题:

---

### 面试题:设计一个高效的线程安全的计数器

**问题描述:**

你需要设计一个线程安全的计数器类 `ThreadSafeCounter`,支持以下功能:

1. **Increment()**: 将计数器的值加 1。
2. **Decrement()**: 将计数器的值减 1。
3. **GetValue()**: 返回当前计数器的值。

要求:
- 该计数器必须是线程安全的,能够同时处理多个线程的并发操作。
- 在高并发环境下,尽量减少锁的开销以提高性能。
- 提供详细的代码实现,并解释为什么你的实现是高效的。

**提示:**
- 考虑使用 .NET 提供的同步机制(如 `lock`、`Interlocked` 类、`SemaphoreSlim` 等)。
- 分析不同实现方式的性能差异。

---

### 参考答案思路:

#### 方法 1:使用 `lock`
```csharp
public class ThreadSafeCounter
{
private int _count;
private readonly object _lock = new object();

public void Increment()
{
lock (_lock)
{
_count++;
}
}

public void Decrement()
{
lock (_lock)
{
_count--;
}
}

public int GetValue()
{
lock (_lock)
{
return _count;
}
}
}
```

**优点:**
- 实现简单,易于理解。
- 确保线程安全。

**缺点:**
- 使用 `lock` 会导致较高的锁开销,在高并发场景下可能成为性能瓶颈。

---

#### 方法 2:使用 `Interlocked` 类
```csharp
public class ThreadSafeCounter
{
private int _count;

public void Increment()
{
Interlocked.Increment(ref _count);
}

public void Decrement()
{
Interlocked.Decrement(ref _count);
}

public int GetValue()
{
return Interlocked.CompareExchange(ref _count, 0, 0);
}
}
```

**优点:**
- `Interlocked` 是无锁操作,性能优于 `lock`。
- 更适合高频读写的场景。

**注意:**
- `Interlocked.CompareExchange` 是一种原子操作,用于在不加锁的情况下获取变量的值。

---

#### 方法 3:结合 `ReaderWriterLockSlim`
```csharp
using System.Threading;

public class ThreadSafeCounter
{
private int _count;
private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();

public void Increment()
{
_lock.EnterWriteLock();
try
{
_count++;
}
finally
{
_lock.ExitWriteLock();
}
}

public void Decrement()
{
_lock.EnterWriteLock();
try
{
_count--;
}
finally
{
_lock.ExitWriteLock();
}
}

public int GetValue()
{
_lock.EnterReadLock();
try
{
return _count;
}
finally
{
_lock.ExitReadLock();
}
}
}
```

**优点:**
- 支持多线程读取时的高性能(读锁可以被多个线程共享)。
- 写操作时互斥,确保数据一致性。

**缺点:**
- 相比 `Interlocked`,实现复杂度更高。

---

### 性能对比分析:
1. **低并发场景**:`lock` 和 `ReaderWriterLockSlim` 性能接近,但 `Interlocked` 更快。
2. **高并发场景**:`Interlocked` 的性能最优,因为它是无锁操作;`ReaderWriterLockSlim` 次之,适合读多写少的场景;`lock` 性能最差,因为锁的竞争会显著增加开销。

---

希望这道题目能够挑战到候选人的多线程编程能力和性能优化思维!如果需要进一步扩展,可以加入更多功能(如限流、统计等)。

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: c#题例-2025-06-16 10:19:06

下一篇: c#题例-2025-06-15 23:12:37

精华推荐