给自己准备的几个问题:
1、c++多线程保序执行的几种实现方案?
2、cpu突然暴增,怎么排查原因?
引自免费微信小程序:皆我百晓生
在C++中,多线程保序执行主要通过同步机制来保证。以下是一些常见的实现方案:
std::mutex
std::mutex
是C++中最基本的互斥锁,用于保护共享资源免受多个线程同时访问。
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void print_block(char c, int n) {
std::lock_guard<std::mutex> lock(mtx);
for (int i = 0; i < n; ++i)
std::cout << c;
std::cout << '\n';
}
int main() {
std::thread t1(print_block, 'A', 5000);
std::thread t2(print_block, 'B', 5000);
t1.join();
t2.join();
return 0;
}
std::lock_guard
和std::unique_lock
std::lock_guard
提供了一种更安全的自动锁管理方式,它会在作用域结束时自动释放锁。std::unique_lock
提供了更多控制锁行为的方法,如尝试锁定或等待条件变量。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void wait_for_signal() {
std::unique_lock<std::mutex> lck(mtx);
cv.wait(lck, []{return ready;});
std::cout << "Signal received\n";
}
void send_signal() {
{
std::lock_guard<std::mutex> lck(mtx);
ready = true;
}
cv.notify_one();
}
int main() {
std::thread t1(wait_for_signal);
std::this_thread::sleep_for(std::chrono::seconds(1));
std::thread t2(send_signal);
t1.join();
t2.join();
return 0;
}
std::atomic
原子类型可以确保对特定类型的变量的读取和写入操作不会被中断。这对于某些简单的保序需求非常有用,尤其是当涉及到单个变量的更新时。
#include <iostream>
#include <thread>
#include <atomic>
std::atomic<int> count{0};
void increment() {
for (int i = 0; i < 100000; ++i)
++count;
}
int main() {
std::thread t1(increment);
std::thread t2(increment);
t1.join();
t2.join();
std::cout << "Count: " << count.load() << '\n';
return 0;
}
CPU使用率突然升高可能是由于多种原因造成的,包括但不限于软件bug、恶意软件、系统资源竞争等。以下是一些排查步骤:
top
或htop
命令行工具查看CPU使用情况。检查应用程序日志,查找任何异常或错误信息,这可能会揭示CPU使用率升高的原因。
通过这些步骤,通常可以找到并解决导致CPU使用率升高的根本原因。