You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多线程阻塞与非阻塞的区别?libcurl中select与线程方案差异咨询

1. 多线程阻塞与非阻塞的区别
  • 阻塞:线程碰到IO操作、锁等待这类任务时,会暂停当前流程,把CPU让出去,直到这个操作彻底完成才会接着跑后面的代码。这段等待时间里线程处于休眠状态,不占CPU资源。
  • 非阻塞:线程执行操作时不会死等结果,而是立刻返回(可能是错误码或者部分结果),马上就能去干别的事。之后得主动轮询或者靠事件通知来确认操作是否完成,期间线程一直占着CPU。
2. libcurl两种请求管理方案的区别

基于select的单线程监听方案

  • 核心是单线程用select()盯着所有libcurl请求的套接字状态,一旦套接字可读或可写,就调用curl_multi_socket_action()处理请求。
  • 线程在select()等待阶段会休眠,不消耗CPU;只有当套接字有事件触发时才会被唤醒干活。
  • 这个线程被select()循环占着,没法同时处理其他CPU密集型任务,顶多只能在事件处理的间隙插点简单逻辑。
  • 要维护libcurl的multi handle,还要处理套接字的增删和select()的超时,逻辑相对绕一点。

基于独立线程+共享队列的方案

  • 主线程把请求任务扔进线程安全的共享队列,独立的工作线程循环检查队列,有任务就用阻塞式的curl_perform()处理。
  • 如果工作线程是忙等(while(1) { check_queue(); })会一直占CPU;要是用条件变量让它在队列空时休眠,空闲时就不耗CPU。
  • 主线程彻底自由,能处理任何其他任务;工作线程专门管网络请求,要是开多个工作线程还能并行处理多个请求。
  • 重点在实现线程安全的队列(要处理锁和条件变量),但libcurl部分用的是你熟悉的阻塞API,逻辑直观,学起来简单。

内容的提问来源于stack exchange,提问作者nothingisme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:08:20