并发2000个线程的CPU占用的问题

线程与CPU占用率
在做个高并发的项目,发现个的情况向大家请教。

下面的代码很简单。就是开2000个线程,线程里就是个死循环,每次循环sleep 20 ms.

当 sleep 20 ms的时候,我的CPU占用10-50%左右。
可是当改为sleep 19或者21 ms的时候,CPU占用一直100%。

为啥?


public static void main(String[] args) {
for (int i = 0; i < 2000; i++) {
new Thread() {
public void run() {
while (true) {
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
}

在C++多线程程序中,使用`std::thread`实现并发操作时,可能会遇到CPU占用率异常升高的问题。这种情况通常由以下几个原因导致: ### 1. **忙等待(Busy Waiting)** 当多个线程频繁地轮询某个条件是否满足而未进行休眠或阻塞时,会导致CPU持续处于高负荷状态。例如,在没有使用`std::condition_variable`的情况下,线程可能通过循环不断检查共享变量的状态。 **解决方案:** - 使用`std::condition_variable`配合互斥锁来实现线程间的等待与通知机制。 - 在需要等待的场景中引入适当的休眠时间,如使用`std::this_thread::sleep_for()`。 ```cpp #include <iostream> #include <thread> #include <condition_variable> std::condition_variable cv; std::mutex mtx; bool ready = false; void wait_for_ready() { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, []{ return ready; }); std::cout << "Ready!" << std::endl; } int main() { std::thread t(wait_for_ready); std::this_thread::sleep_for(std::chrono::seconds(2)); { std::lock_guard<std::mutex> lock(mtx); ready = true; } cv.notify_one(); t.join(); return 0; } ``` ### 2. **过多的线程竞争资源** 如果多个线程同时访问共享资源且缺乏有效的同步机制,可能导致大量的上下文切换和锁竞争,从而增加CPU负担。 **解决方案:** - 减少对共享资源的依赖,尽可能采用无锁编程或局部变量替代全局变量。 - 使用细粒度锁或读写锁优化并发访问效率。 - 考虑使用`std::atomic`类型进行原子操作以减少锁的使用[^2]。 ### 3. **线程数量超过核心数** 创建的线程数远超物理核心数时,操作系统会频繁进行线程调度,导致上下文切换开销增大,进而影响性能。 **解决方案:** - 根据系统硬件配置合理设置线程池大小,通常建议为处理器核心数或其倍数。 - 利用任务队列和工作窃取策略提升线程利用率。 ### 4. **死循环或逻辑错误** 线程执行过程中因逻辑设计不当进入无限循环,或者未能正确退出线程函数,也会造成CPU占用过高。 **解决方案:** - 检查线程函数是否存在死循环,确保所有路径都能正常返回或退出。 - 对于长时间运行的任务,应提供中断机制以便及时终止不必要的线程。 ### 5. **I/O密集型任务未异步处理** 将I/O操作放在主线程或其他关键线程中执行,容易阻塞其他计算任务,间接导致CPU利用率升高。 **解决方案:** - 将I/O操作移至单独的工作线程中执行,避免阻塞主线程。 - 使用异步库如`std::async`简化异步编程模型。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值