IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:并发编程

共 27 篇相关文章

IT 累计浏览 2,611

spinlock剖析与改进

这篇讲的是操作系统中常见的同步原语——spinlock(自旋锁)的深度剖析与实践优化。作者从标准自旋锁的实现原理出发,解释了其通过忙等待避免线程切换的设计初衷,但也直接点明了在特定场景下的性能瓶颈:当锁被持有时,其他等待线程会持续空转CPU,造成资源浪费。 文章的核心价值在于“改进”部分。作者详细拆解了标准实现的问题,并提出了具体的优化思路,比如结合 ticket spinlock 或 MCS lock 的机制来减少缓存行争用与不必要的CPU空转。通过对比分析,清晰地展示了不同实现在多核环境下对性能、公平性和扩展性的实际影响。 从淘宝子嘉的视角来看,这并非纯理论探讨,而是结合了生产环境经验。他不仅讲清楚了“是什么”和“为什么”,更给出了“怎么改”的实践方案,对于需要处理高并发锁竞争的开发者来说,提供了切实可行的优化方向。

IT 累计浏览 3,658

erlang学习手记

这篇手记记录了作者在Ubuntu 10.04系统下为Eclipse安装Erlang插件erlide的完整过程。对于想要搭建Erlang开发环境的同学来说,这是一个非常具体的实践参考。 文章从环境准备讲起,详细说明了需要先安装的Java运行时和Eclipse版本等基础依赖。接着,重点拆解了erlide插件的两种安装方式——通过Eclipse更新站点在线安装,以及手动下载插件包进行离线安装。作者不仅给出了清晰的步骤,还分享了在安装过程中可能遇到的典型问题,比如插件安装后无法识别已配置的Erlang/OTP运行时路径,并指出了解决这一配置问题的具体操作。 整个记录语言朴实,没有泛泛而谈,而是紧扣实际操作中的细节。对于初涉Erlang或受困于开发工具配置的读者,这篇手记能帮助避开一些常见的“坑”,顺利迈出编写第一行Erlang代码的第一步。

IT 累计浏览 5,988

Unix高级环境编程系列笔记

这篇文章围绕 Unix 环境下的多线程编程核心概念展开,以一系列具体问题为线索,系统性地梳理了 pthreads 库的关键 API 和设计原理。 作者从线程的基本标识(pthread_t 与进程 pid_t 的区别)讲起,深入到线程的完整生命周期管理:如何创建新线程、线程如何退出以及主线程如何通过 pthread_join 获取退出码并回收资源。文章特别指出了一个常见的陷阱——将线程函数中的栈变量地址通过 pthread_exit 返回,这会导致访问已销毁的栈内存。 在同步与互斥部分,文章讲解了互斥锁(mutex)的使用与销毁,并引出了读写锁和条件变量这两种更高级的同步机制。对于多线程编程中最棘手的死锁问题,文章也讨论了其成因与避免策略。 全文穿插了简明的代码示例和缺陷分析,将抽象的 API 与实际编程场景结合,使得这些知识点不再是孤立的函数手册条目,而构成了一个解决多线程编程实际问题的完整知识框架。

IT 累计浏览 6,261

Nginx源码分析-事件循环

这篇文章深入剖析了Nginx高性能网络模型的核心——事件循环(worker cycle)。作者将目光聚焦于worker进程陷入的“死循环”中,专门拆解其负责事件处理的关键函数`ngx_process_events_and_timers`。 核心思路在于协调与优化。文章详细解读了函数如何先通过`accept_mutex`互斥体来解决多进程监听同一端口的“惊群”问题,并巧妙利用`ngx_accept_disabled`变量实现简单的连接负载均衡。获取锁的进程不会立即处理事件,而是通过`NGX_POST_EVENTS`标志将事件暂存到队列,以尽快释放锁,避免长时间占用。 函数主体随后调用`ngx_process_events`(对应epoll等I/O多路复用模块)等待事件发生。处理过程分为两步:先处理暂存的`accept`事件(即新连接),完成后再处理普通读写事件队列。同时,如果等待耗时,还会检查并触发已超时的定时器。 最巧妙的设计在于整个流程的“锁-事件-处理”分离:通过精巧的锁和队列状态管理,在保证单进程处理新连接的稳定性前提下,实现了高效的多进程并发处理,这正是Nginx高并发能力的基石之一。

IT 累计浏览 5,054

为什么在多线程程序中要慎用volatile关键字?

这篇讲的是在多核时代,程序员为何对volatile关键字需保持警惕。作者从volatile的“可见性”保证出发,指出一个常见误区:许多人认为它能解决线程间的数据同步,但在多线程环境下,它无法保证复合操作的原子性。 文章深入剖析了根本原因:volatile仅确保单个读写操作的即时性,但像i++这类自增操作,在机器码层面包含读取、修改、写回三步,中间仍可能被其他线程打断。这会导致数据竞争与结果不确定。 作者接着对比了volatile与synchronized、Lock等同步机制。volatile轻量、无锁,适合状态标志;而涉及复杂条件判断或需要原子性时,必须使用锁。通过具体代码示例,文章清晰地展示了volatile在计数器等场景下的“坑”,并给出了正确使用同步器的解决方案。 核心结论是:volatile是优化工具而非通用同步方案。在多线程编程中,必须明确区分“可见性”与“原子性”需求,对volatile的使用场景保持清醒认识,才能写出既高效又正确的并发代码。

IT 累计浏览 3,055

多核编程的难题(二)

作者在完成一篇关于并行计算的论文后,转而写下这篇延续性的讨论,核心是传递他对多核时代并行编程前景的乐观态度。这篇文章并不聚焦于某个具体的技术难点,而是从更宏观的视角,拆解了几个关键的方面来论证“多核的曙光”这一观点。 作者试图说服读者,尽管多核编程面临诸多挑战,但从技术演进、工具链成熟度和社区实践等多个维度看,并行化正从“困难”走向“必然”。文章将这些乐观的理由分层阐述,可能涵盖了硬件架构的并行化趋势、编程模型与语言的逐步支持,以及开发者生态的积累与适应。 对于正在或即将面对多核开发难题的工程师而言,这篇文章提供了一个跳出具体代码层面、从发展趋势上重新审视问题的窗口。它带来的启发或许在于:多核编程的难题并非无解的高墙,而是产业与技术共同演进中一个正在被系统性消解的过程。

IT 累计浏览 3,622

linux下多线程的创建与等待详解

这篇详细讲解了Linux环境下多线程编程的基础知识。文章从线程的唯一标识——线程号(pthread_t)说起,介绍了如何通过pthread_self()获取当前线程ID。核心部分聚焦于线程的创建过程,指明了线程函数必须严格遵循“void * Thread_Function(void *)”的声明格式,并解释了创建线程的常用API。对于刚接触多线程开发的程序员而言,这篇文章清晰地梳理了从理解线程身份到动手创建线程的第一步,是掌握并发编程模型不可或缺的入门指引。