并发编程中的核心概念
1. 队列(Queue)
队列是一种先进先出(FIFO)的数据结构,用于在线程之间传递数据,确保线程安全。
特点:
- 线程安全:队列内部实现了线程同步,多个线程可以安全地访问。
- FIFO:数据按照进入队列的顺序被处理。
应用场景:
- 生产者-消费者模型。
- 任务调度系统。
示例代码(Python):
import queue# 创建队列
q = queue.Queue()# 放入数据
q.put("Task 1")
q.put("Task 2")# 取出数据
while not q.empty():task = q.get()print(f"Processing {task}")
2. 事件(Event)
事件是一种线程间的信号机制,用于线程之间的同步。
特点:
- 信号机制:线程可以等待事件发生,或者通知其他线程事件已经发生。
- 灵活性:可用于复杂的线程间通信。
应用场景:
- 控制线程的执行顺序。
- 多线程任务完成的通知。
示例代码(Python):
import threading# 创建事件
event = threading.Event()def worker():print("Worker waiting for event...")event.wait() # 等待事件触发print("Event received, worker proceeding.")# 创建线程
thread = threading.Thread(target=worker)
thread.start()# 触发事件
print("Main thread setting event.")
event.set()
3. 信号量(Semaphore)
信号量用于控制同时访问某一资源的线程数量。
特点:
- 计数器:限制线程的并发数量。
- 线程同步:保护共享资源。
应用场景:
- 限制数据库连接池的大小。
- 控制访问共享资源的线程数。
示例代码(Python):
import threading
import time# 创建信号量
semaphore = threading.Semaphore(2) # 最多允许2个线程访问def worker(name):print(f"{name} waiting for semaphore...")with semaphore: # 获取信号量print(f"{name} acquired semaphore.")time.sleep(2)print(f"{name} released semaphore.")# 创建线程
threads = [threading.Thread(target=worker, args=(f"Thread-{i}",)) for i in range(4)]
for t in threads:t.start()
for t in threads:t.join()
4. 互斥锁(Mutex/Lock)
互斥锁用于确保某一时刻只有一个线程能够访问某一共享资源。
特点:
- 独占性:只有一个线程能持有锁。
- 线程同步:防止数据竞争。
应用场景:
- 保护共享变量。
- 防止线程间的数据竞争。
示例代码(Python):
import threading# 创建锁
lock = threading.Lock()
shared_resource = 0def worker():global shared_resourcefor _ in range(100000):with lock: # 获取锁shared_resource += 1# 创建线程
threads = [threading.Thread(target=worker) for _ in range(2)]
for t in threads:t.start()
for t in threads:t.join()print(f"Final value of shared_resource: {shared_resource}")
对比总结
特性 | 队列(Queue) | 事件(Event) | 信号量(Semaphore) | 互斥锁(Mutex/Lock) |
---|---|---|---|---|
主要功能 | 数据传递 | 信号通知 | 控制并发线程数 | 保护共享资源 |
是否线程安全 | 是 | 是 | 是 | 是 |
使用场景 | 任务队列 | 线程间通知 | 资源访问限制 | 共享资源保护 |