跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C 语言 posix 线程
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:C语言POSIX线程}} {{编程概念导航}} == 简介 == '''POSIX线程'''(通常称为'''pthreads''')是遵循[[POSIX]]标准的线程库,用于在C语言中实现多线程编程。它提供了一套API,允许开发者创建、管理和同步线程,从而充分利用多核处理器资源。pthreads是Unix/Linux系统中的标准线程实现,也是跨平台多线程开发的重要工具。 多线程编程的核心目标是实现'''并发执行''',即多个线程在同一进程内共享内存空间,但拥有独立的执行流。与多进程相比,线程的创建和切换开销更小,但需要更谨慎地处理'''资源共享'''和'''同步问题'''。 == 核心概念 == === 线程与进程的区别 === * '''进程''':独立的执行单元,拥有独立的地址空间和系统资源。 * '''线程''':轻量级进程,共享同一进程的地址空间和资源,但拥有独立的栈和程序计数器。 <mermaid> graph LR A[进程] --> B[主线程] A --> C[线程1] A --> D[线程2] B & C & D --> E[共享内存/全局变量] </mermaid> === pthreads 基本API === 以下是pthreads的核心函数: * <code>pthread_create()</code>:创建新线程。 * <code>pthread_join()</code>:等待线程终止。 * <code>pthread_exit()</code>:显式退出线程。 * <code>pthread_mutex_lock()</code>:互斥锁,用于同步。 == 基础示例 == === 创建线程 === 以下示例展示如何创建并运行一个线程: <syntaxhighlight lang="c"> #include <stdio.h> #include <pthread.h> // 线程函数 void* print_message(void* msg) { printf("线程消息: %s\n", (char*)msg); pthread_exit(NULL); } int main() { pthread_t thread; char* message = "Hello, pthread!"; // 创建线程 int ret = pthread_create(&thread, NULL, print_message, (void*)message); if (ret != 0) { perror("线程创建失败"); return 1; } // 等待线程结束 pthread_join(thread, NULL); printf("主线程结束\n"); return 0; } </syntaxhighlight> '''输出''': <pre> 线程消息: Hello, pthread! 主线程结束 </pre> === 线程同步(互斥锁) === 当多个线程访问共享资源时,需使用互斥锁(Mutex)避免竞争条件: <syntaxhighlight lang="c"> #include <stdio.h> #include <pthread.h> int counter = 0; pthread_mutex_t lock; void* increment_counter(void* arg) { pthread_mutex_lock(&lock); for (int i = 0; i < 100000; i++) counter++; pthread_mutex_unlock(&lock); pthread_exit(NULL); } int main() { pthread_t t1, t2; pthread_mutex_init(&lock, NULL); pthread_create(&t1, NULL, increment_counter, NULL); pthread_create(&t2, NULL, increment_counter, NULL); pthread_join(t1, NULL); pthread_join(t2, NULL); printf("最终计数器值: %d\n", counter); // 应为200000 pthread_mutex_destroy(&lock); return 0; } </syntaxhighlight> == 高级主题 == === 条件变量 === 条件变量(<code>pthread_cond_t</code>)用于线程间通信,允许线程等待特定条件成立: <syntaxhighlight lang="c"> #include <pthread.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int ready = 0; void* consumer(void* arg) { pthread_mutex_lock(&mutex); while (!ready) pthread_cond_wait(&cond, &mutex); printf("条件满足,继续执行\n"); pthread_mutex_unlock(&mutex); pthread_exit(NULL); } void* producer(void* arg) { pthread_mutex_lock(&mutex); ready = 1; pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex); pthread_exit(NULL); } </syntaxhighlight> === 线程属性 === 可通过<code>pthread_attr_t</code>设置线程属性(如栈大小、分离状态): <syntaxhighlight lang="c"> pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_t thread; pthread_create(&thread, &attr, thread_function, NULL); </syntaxhighlight> == 实际应用案例 == === 多线程Web服务器 === Web服务器(如Nginx)使用线程池处理并发请求: 1. 主线程监听端口,接收连接。 2. 工作线程处理请求(读取文件、生成响应)。 === 并行计算 === 将大规模计算任务(如矩阵乘法)分解为多个线程并行执行: <math> C_{i,j} = \sum_{k=1}^{n} A_{i,k} \times B_{k,j} </math> == 常见问题 == * '''Q: 线程安全是什么?''' A: 函数或代码在多线程环境下能正确执行,无需额外同步。 * '''Q: 如何避免死锁?''' A: 按固定顺序获取锁,或使用超时机制(如<code>pthread_mutex_trylock</code>)。 == 总结 == POSIX线程是C语言多线程编程的核心工具,适用于需要高并发和资源共享的场景。初学者应重点掌握线程创建、同步机制(互斥锁、条件变量),而高级用户可探索线程池、性能优化等进阶主题。 {{编程概念页脚}} [[Category:编程语言]] [[Category:C]] [[Category:C 语言多线程与并发]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:编程概念导航
(
编辑
)
模板:编程概念页脚
(
编辑
)