Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >AI写作

c#题例-2025-06-14 00:18:40

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

---

### 面试题:实现一个线程安全的有界队列(Bounded Blocking Queue)

**问题描述:**

你需要实现一个线程安全的有界队列(Bounded Blocking Queue),该队列具有以下特性:
1. 队列的最大容量为 `N`,当队列已满时,生产者线程会被阻塞直到有空间可用。
2. 当队列为空时,消费者线程会被阻塞直到有新的元素可以消费。
3. 队列必须是线程安全的,能够支持多个生产者和多个消费者同时操作。

**要求:**
- 使用 C# 的同步机制(如 `Monitor`、`lock`、`SemaphoreSlim` 或其他)来确保线程安全。
- 提供 `Enqueue` 方法用于添加元素,`Dequeue` 方法用于移除元素。
- 如果队列已满,`Enqueue` 方法会阻塞直到有空间;如果队列为空,`Dequeue` 方法会阻塞直到有元素。
- 考虑性能优化,尽量减少不必要的锁竞争。

**示例代码框架:**

```csharp
using System;
using System.Collections.Generic;
using System.Threading;

public class BoundedBlockingQueue
{
private readonly int capacity; // 队列的最大容量
private readonly Queue queue; // 内部队列

public BoundedBlockingQueue(int capacity)
{
this.capacity = capacity;
this.queue = new Queue();
}

public void Enqueue(T item)
{
// TODO: 实现线程安全的入队逻辑
}

public T Dequeue()
{
// TODO: 实现线程安全的出队逻辑
}
}
```

**测试场景:**

1. 创建一个容量为 5 的队列。
2. 启动 3 个生产者线程,每个线程向队列中添加 10 个随机数。
3. 启动 2 个消费者线程,每个线程从队列中取出并打印 15 个数字。
4. 确保所有生产者和消费者的线程都能正确协作,不会出现死锁或数据竞争。

---

### 解题思路提示:
- 可以使用 `Monitor.Wait` 和 `Monitor.Pulse` 来实现生产者和消费者之间的通信。
- 或者使用 `SemaphoreSlim` 来控制队列的空闲空间和已有元素的数量。
- 注意避免忙等待(Busy Waiting),确保线程在不需要工作时进入等待状态。

希望这道题能挑战到你的 C# 并发编程能力!如果有需要,我可以提供参考答案。

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

上一篇: c#题例-2025-06-14 05:52:06

下一篇: c#题例-2025-06-13 18:45:13

精华推荐