如何在Ubuntu中实现C++多线程编程
在Ubuntu中,利用C++11标准库的头文件实现多线程编程,需先通过apt安装g++编译器。编写代码演示线程创建、执行与等待流程,调用std::thread即可轻松实现并发,编译时需加-pthread选项。
在Ubuntu上搞C++多线程编程,其实比你想象的要简单——只要你用上了C++11标准库里的头文件,一切就能顺滑地跑起来。下面咱们一步步来,从环境准备到实际代码,再到同步技巧,给你理清整条路。

步骤1:安装必要的工具
先检查一下系统里有没有g++编译器。如果还没有,终端里输两行命令就搞定:
sudo apt update
sudo apt install g++
步骤2:编写多线程C++代码
新建一个源文件,比如multithread_example.cpp,然后敲进下面这段示例。别被它简单的外表骗了——它演示了多线程最核心的“创建-执行-等待”流程。
#include
#include
// 线程函数
void helloFunction() {
std::cout << "Hello from a thread!" << std::endl;
}
int main() {
// 创建一个线程
std::thread t(helloFunction);
// 等待线程完成
t.join();
std::cout << "Hello from main thread!" << std::endl;
return 0;
}
步骤3:编译代码
编译时最关键的是别忘了加上-pthread选项,否则链接器会找不着线程库。用这条命令:
g++ -std=c++11 -pthread multithread_example.cpp -o multithread_example
步骤4:运行程序
跑起来看看效果:
./multithread_example
输出应该类似这样:
Hello from a thread!
Hello from main thread!
两个“Hello”先后出现,证明了子线程和主线程都在正常工作。当然,这只是开胃菜。
进一步学习
真实场景下,多线程要面对的坑远不止“hello world”这么简单。下面这几个方向值得深入:
- 线程同步:用
std::mutex、std::lock_guard、std::unique_lock来避免数据竞争。 - 条件变量:通过
std::condition_variable实现线程间的“等待-通知”机制。 - 原子操作:用
std::atomic来做无锁编程——性能好,但需要谨慎设计。 - 线程池:自己手写太麻烦?可以借助第三方库(比如
ThreadPool)管理一批线程的复用。
示例:线程同步
来看一个经典的互斥锁示例,它能保证多个线程打印时不会乱成一锅粥:
#include
#include
#include
std::mutex mtx; // 全局互斥锁
void printMessage(const std::string& msg) {
mtx.lock(); // 加锁
std::cout << msg << std::endl;
mtx.unlock(); // 解锁
}
int main() {
std::thread t1(printMessage, "Hello from thread 1!");
std::thread t2(printMessage, "Hello from thread 2!");
t1.join();
t2.join();
return 0;
}
编译运行后,你会发现两个线程的输出永远不会交错——锁保证了同一时刻只有一个线程能碰cout。这就是最基础的同步手段。
从环境搭建到实际代码,再到同步实战,这些步骤足够你快速上手Ubuntu下的C++多线程开发。如果想深入,不妨试试把条件变量和原子操作也练一练,多线程的世界远比你想象的更有趣。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















