Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-11 03:12:23

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

---

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

请实现一个线程安全的计数器类 `ThreadSafeCounter`,该类需要满足以下要求:

1. **功能要求**:
- 提供两个方法:`Increment()` 和 `Decrement()`,分别用于增加和减少计数器的值。
- 提供一个只读属性 `CurrentCount`,用于获取当前计数器的值。

2. **性能要求**:
- 尽量减少锁的使用,以提高多线程环境下的性能。
- 如果可能,请使用 .NET 提供的高效并发工具(如 `Interlocked` 或 `SpinLock`)。

3. **边界条件**:
- 计数器的值不能低于 0。如果调用 `Decrement()` 时计数器已经是 0,则忽略此次操作。
- 计数器的值没有上限。

4. **测试场景**:
- 编写一个测试程序,模拟多个线程同时对计数器进行增减操作,并验证最终结果是否正确。

---

### 示例代码框架

以下是部分代码框架,您可以在此基础上完成实现:

```csharp
using System;
using System.Threading;

public class ThreadSafeCounter
{
private int _count;

public ThreadSafeCounter()
{
_count = 0;
}

// 实现 Increment 方法
public void Increment()
{
// TODO: 实现线程安全的增加操作
}

// 实现 Decrement 方法
public void Decrement()
{
// TODO: 实现线程安全的减少操作,并确保计数器不会低于 0
}

// 只读属性 CurrentCount
public int CurrentCount
{
get
{
// TODO: 返回当前计数器的值
return _count;
}
}
}

// 测试代码
class Program
{
static void Main(string[] args)
{
ThreadSafeCounter counter = new ThreadSafeCounter();

// 创建多个线程,模拟并发增减操作
Thread[] threads = new Thread[10];
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(() =>
{
for (int j = 0; j < 1000; j++)
{
if (i % 2 == 0)
counter.Increment();
else
counter.Decrement();
}
});
threads[i].Start();
}

foreach (var thread in threads)
{
thread.Join();
}

Console.WriteLine("Final Count: " + counter.CurrentCount);
}
}
```

---

### 解题提示

1. **线程安全的实现**:
- 使用 `Interlocked` 类中的方法(如 `Interlocked.Increment` 和 `Interlocked.Decrement`)来实现原子操作。
- 对于边界条件(如计数器不能低于 0),可以结合 `Interlocked.CompareExchange` 来实现。

2. **性能优化**:
- 避免使用传统的 `lock` 关键字,因为它的开销较大。
- 考虑使用 `SpinLock` 或无锁编程技术来提高性能。

3. **测试验证**:
- 确保在高并发环境下,计数器的值始终正确。
- 测试不同线程数量和操作次数的情况,观察性能表现。

---

这道题目考察了候选人对多线程编程的理解、对 .NET 并发工具的掌握以及性能优化的能力。希望这对您有所帮助!

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

上一篇: c#题例-2025-06-11 08:45:31

下一篇: c#题例-2025-06-10 21:38:55

精华推荐