C语言标准本身不支持多线程,pthread_create(POSIX)、C11 、Windows API(CreateThread)及fork均非ISO C标准:前者仅限类Unix系统且需-lpthread;C11线程库现实支持极差,glibc未实现;Windows API完全不可移植;fork创建进程而非线程,不共享内存。
标准 C 语言本身不提供线程支持,pthread_create、std::thread、Windows API 等都不是 C 标准库的一部分。所谓“C 多线程四种方式”,实际是混用了不同平台/标准的实现,必须明确区分适用环境和依赖条件。

pthread_create 是最常见但非标准的方案POSIX 线程(pthreads)是 Linux/macOS 的事实标准,但需链接 -lpthread,且头文件为 。它不是 ISO C 的一部分,跨 Windows 需 MinGW 或第三方兼容层。
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
void*,参数也必须是 void*,强制类型转换需谨慎pthread_join 或 pthread_detach,子线程可能被意外终止EAGAIN、EINVAL),不能用 perror 打印C11 理论可用,但现实支持极差C11 标准引入了 ,提供 thrd_create、mtx_lock 等接口,目标是可移植。但截至 2025 年,GCC 和 Clang 默认不启用该功能,MSVC 完全不支持,musl libc 仅部分实现。
-std=c11 -pthread,且仍可能链接失败,运行时会报 undefined reference to thrd_create
CreateThread)完全不可移植这是 Win32 原生方式,头文件为 ,函数为 CreateThread。它与 pthread 语义差异大,比如栈大小控制、线程局部存储(TLS)机制、退出行为(ExitThread vs return)都不同。
CreateThread 第四个参数是 LPVOID lpParameter,接收任意指针,无需强转,但回调函数签名是 DWORD WINAPI ThreadProc(LPVOID)
WaitForSingleObject 等待子线程结束,而非 pthread_join
CloseHandle 释放线程对象句柄,否则资源泄漏;而 pthread 中 pthread_join 同时完成等待和清理CreateThread 和 C 运行时(如 malloc/free)有风险,推荐用 _beginthreadex 替代有些资料把 fork 列为“多线程方式”,属于概念混淆。fork 创建的是进程,有独立地址空间、文件描述符副本、不共享全局变量——和线程的共享内存模型本质不同。它开销更大,IPC 需额外机制(pipe、mmap、shm),也不能替代线程同步原语(如 mutex)。
fork 后父子进程各自执行,无法用 pthread_mutex_t 保护共享数据(除非用 PTHREAD_PROCESS_SHARED + mmap)fork 可行;但凡涉及共享内存或低延迟协同,就不是正确选择真正写 C 多线程时,别纠结“四种方法”的分类,先确定目标平台:Linux/macOS 就用 pthread,Windows 就用 CreateThread 或 _beginthreadex,跨平台项目则应封装抽象层或改用 Rust/C++ 等自带标准线程支持的语言。C11 目前只是纸面标准,别在生产环境赌它能跑通。