c#题例-2025-06-12 08:12:10
日期: 2025-06-12 分类: AI写作 34次阅读
好的!以下是一道专家级别的 C# 程序员逻辑面试题,涉及多线程、性能优化和并发控制等高级概念:
---
### 面试题:实现一个线程安全的生产者-消费者模式
**问题描述:**
你需要设计一个高效的生产者-消费者模型,使用 C# 实现。具体要求如下:
1. **缓冲区限制**:缓冲区的最大容量为 `N`(由用户指定),当缓冲区满时,生产者必须等待,直到有空闲空间。
2. **线程安全**:确保多个生产者和消费者可以同时安全地访问缓冲区,不会出现数据竞争或死锁。
3. **性能优化**:尽量减少线程间的阻塞时间,提高吞吐量。
4. **扩展性**:代码应易于扩展,例如支持动态调整缓冲区大小或添加更多功能。
**输入/输出要求:**
- 生产者会生成一系列整数(从 1 开始递增)并放入缓冲区。
- 消费者会从缓冲区中取出整数并打印出来。
- 缓冲区的大小 `N` 和生产者/消费者的数量由用户指定。
**额外挑战:**
- 使用 `Task` 或 `async/await` 来实现异步操作。
- 提供一种机制来监控缓冲区的状态(如当前大小、剩余空间等)。
---
### 示例代码框架
以下是一个简化的代码框架,供你参考:
```csharp
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;
public class ProducerConsumer
{
private BlockingCollection
private int bufferSize;
public ProducerConsumer(int size)
{
this.bufferSize = size;
this.buffer = new BlockingCollection
}
public void Produce(int id, CancellationToken token)
{
int count = 1;
while (!token.IsCancellationRequested)
{
try
{
buffer.Add(count++);
Console.WriteLine($"Producer {id} produced: {count - 1}");
}
catch (InvalidOperationException) // Buffer is full
{
Thread.Sleep(100); // Wait and retry
}
}
}
public void Consume(int id, CancellationToken token)
{
while (!token.IsCancellationRequested || buffer.Count > 0)
{
if (buffer.TryTake(out int item, 100))
{
Console.WriteLine($"Consumer {id} consumed: {item}");
}
}
}
public static void Main(string[] args)
{
int bufferSize = 5; // Example buffer size
int producerCount = 2;
int consumerCount = 3;
var producerConsumer = new ProducerConsumer(bufferSize);
var cts = new CancellationTokenSource();
// Start producers and consumers
var tasks = new List
for (int i = 0; i < producerCount; i++)
{
tasks.Add(Task.Run(() => producerConsumer.Produce(i + 1, cts.Token)));
}
for (int i = 0; i < consumerCount; i++)
{
tasks.Add(Task.Run(() => producerConsumer.Consume(i + 1, cts.Token)));
}
// Simulate stopping after 5 seconds
Task.Delay(5000).ContinueWith(_ => cts.Cancel());
Task.WaitAll(tasks.ToArray());
}
}
```
---
### 考察点:
1. **线程同步**:如何正确使用 `BlockingCollection`、`Monitor`、`SemaphoreSlim` 等工具来实现线程安全。
2. **性能优化**:如何减少不必要的上下文切换和锁争用。
3. **异步编程**:是否能熟练使用 `Task` 和 `async/await` 来提高程序的响应性。
4. **扩展性设计**:代码是否易于维护和扩展,例如支持动态调整缓冲区大小或添加日志功能。
希望这道题目能够充分考察候选人的技术水平!
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
标签:AI写作
精华推荐