跳转到内容

并发编程

来自代码酷

并发编程[编辑 | 编辑源代码]

并发编程是指在同一时间段内执行多个计算任务的编程范式,这些任务可能在单个处理器上通过时间分片交替执行,也可能在多个处理器上真正并行执行。并发编程是现代计算机科学中的重要概念,特别是在多核处理器普及和分布式系统广泛应用的背景下。

基本概念[编辑 | 编辑源代码]

进程与线程[编辑 | 编辑源代码]

  • 进程:操作系统资源分配的基本单位,拥有独立的地址空间
  • 线程:轻量级进程,共享相同地址空间,是CPU调度的基本单位

graph TD A[进程] --> B[主线程] A --> C[线程1] A --> D[线程2]

并发与并行[编辑 | 编辑源代码]

  • 并发:逻辑上的同时执行(可能交替运行)
  • 并行:物理上的同时执行(需要多核支持)

数学表示为:解析失败 (语法错误): {\displaystyle 并发度 = \min(任务数, 处理器数)}

并发模型[编辑 | 编辑源代码]

共享内存模型[编辑 | 编辑源代码]

线程通过共享内存进行通信,需要同步机制如:

# Python线程同步示例
import threading

counter = 0
lock = threading.Lock()

def increment():
    global counter
    with lock:
        counter += 1

消息传递模型[编辑 | 编辑源代码]

进程/线程通过发送消息通信,如:

常见问题与解决方案[编辑 | 编辑源代码]

竞态条件[编辑 | 编辑源代码]

当多个线程访问共享数据且结果取决于执行顺序时发生。

解决方案:

  • 使用同步原语
  • 采用不可变数据结构

死锁[编辑 | 编辑源代码]

多个线程互相等待对方释放资源。

四个必要条件: 1. 互斥条件 2. 占有并等待 3. 非抢占条件 4. 循环等待

活锁[编辑 | 编辑源代码]

线程不断改变状态但无法继续执行。

现代并发编程[编辑 | 编辑源代码]

异步编程[编辑 | 编辑源代码]

使用async/await语法实现非阻塞IO操作:

// JavaScript异步示例
async function fetchData() {
    const response = await fetch('https://api.example.com/data');
    const data = await response.json();
    return data;
}

协程[编辑 | 编辑源代码]

轻量级线程,由程序员控制调度。

并行集合[编辑 | 编辑源代码]

如Java的Stream API、.NET的PLINQ:

// Java并行流示例
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.parallelStream().reduce(0, Integer::sum);

实际应用案例[编辑 | 编辑源代码]

  • Web服务器处理并发请求
  • 数据库事务管理
  • 实时数据处理系统
  • 游戏开发中的物理模拟和AI计算

学习资源[编辑 | 编辑源代码]

参见[编辑 | 编辑源代码]