CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
C 语言入门/课时/并发与进程
RawBlame
课时目录12 节

C 语言入门

  1. 01C 是什么
  2. 02类型与变量
  3. 03控制流与运算符
  4. 04函数
  5. 05指针与内存
  6. 06数组与字符串
  7. 07结构体与联合体
  8. 08预处理器
  9. 09编译与构建
  10. 10并发与进程
  11. 11调试与测试
  12. 12综合练习

并发与进程

pthread、mutex、atomic。

30 分钟

并发与进程

C 标准库本身线程支持有限(C11 <threads.h> 普及度不一),POSIX pthread 是 Linux/macOS 常见方案。对照 /roadmaps/c,本课介绍线程、互斥锁与原子操作入门。

学习目标

  • 理解进程与线程的区别
  • 用 pthread 创建线程并 join
  • 用 mutex 保护共享数据
  • 了解 _Atomic 的基本用法

核心概念

pthread 与互斥锁

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>

#define NUM_THREADS 4
#define INCREMENTS  100000

static pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
static long counter = 0;

static void *worker(void *arg) {
    long id = (long)arg;
    for (int i = 0; i < INCREMENTS; i++) {
        pthread_mutex_lock(&mtx);
        counter++;
        pthread_mutex_unlock(&mtx);
    }
    printf("thread %ld done\n", id);
    return NULL;
}

int main(void) {
    pthread_t threads[NUM_THREADS];

    for (long t = 0; t < NUM_THREADS; t++) {
        if (pthread_create(&threads[t], NULL, worker, (void *)t) != 0) {
            perror("pthread_create");
            return 1;
        }
    }

    for (int t = 0; t < NUM_THREADS; t++) {
        pthread_join(threads[t], NULL);
    }

    printf("counter=%ld (expected %d)\n",
           counter, NUM_THREADS * INCREMENTS);

    /* C11 原子(可选) */
    _Atomic int atomic_val = 0;
    atomic_val++;
    printf("atomic_val=%d\n", atomic_val);

    return 0;
}

编译(Linux/macOS):

gcc -std=c11 -pthread concurrent.c -o concurrent

要点

概念说明
进程独立地址空间,fork/exec 创建
线程共享地址空间,需同步
mutex互斥锁,保护临界区
数据竞争未同步的并发写是未定义行为

Windows 用 _beginthreadex 或 pthreads-win32 移植层;生产环境可选线程池库。

与 C++/Java 对照

方面C (pthread)C++Java
线程 APIpthreadstd::threadThread / 虚拟线程
同步mutex、semmutex、atomic、Lock
synchronized
原子_Atomicstd::atomicAtomicInteger
线程池需第三方标准库有限ExecutorService
内存模型依赖实现C++11 起标准化JMM

Java 并发库更完整;C 程序员需显式管理锁与生命周期,错误更难排查。

练习

  • 创建 2 个线程分别打印消息,主线程 join
  • 去掉示例中的 mutex,观察 counter 结果为何不对
  • 用 _Atomic long 重写计数器,对比 mutex 方案
  • 说明进程与线程在内存隔离上的差异

小结

共享数据必同步;pthread + mutex 是 Unix 系 C 并发入门。 下一课学习调试与测试。

加载本节练习…
← 上一课编译与构建下一课 →调试与测试