发布于2026-07-16 阅读(0)
扫一扫,手机访问
在CentOS上使用C++进行并发编程,其实路子挺多的。从C++11标准库的优雅封装,到底层的POSIX线程直接操作,各有各的用武之地。下面把这几种主流手段掰开揉碎了讲讲,配合代码示例,拿过去就能用。

C++11引入的头文件,让多线程编程变得像搭积木一样简单。不需要再手动管理pthread的创建销毁,标准库帮你干了大半的脏活。
#include
#include
void helloFunction() {
std::cout << "Hello from a thread!" << std::endl;
}
int main() {
std::thread t(helloFunction);
t.join(); // 等待线程完成
return 0;
}
看,就这么几行,一个线程就跑起来了。注意join()调用不能少,否则主线程跑完了子线程还没结束,程序就炸了。
如果说多线程是直接派人干活,那和就是“你忙你的,回头告诉我结果”。尤其适合那种需要等一会儿才能拿到值的场景,比如网络请求或复杂计算。
#include
#include
int asyncFunction() {
std::this_thread::sleep_for(std::chrono::seconds(2));
return 42;
}
int main() {
std::future result = std::async(std::launch::async, asyncFunction);
std::cout << "Waiting for the result..." << std::endl;
int value = result.get(); // 获取异步操作的结果
std::cout << "The result is: " << value << std::endl;
return 0;
}
这个例子中,async给了你两个策略选择:std::launch::async强制新开线程,std::launch::deferred则是懒加载,等get()时才执行。实际项目中怎么选?关键看你对并发粒度的要求。
多线程最头疼的就是数据竞争。好在标准库给你备好了、这些工具,配合并发容器,能让你的共享数据安全不少。下面这个例子演示了用std::mutex保护std::vector的写入操作。
#include
#include
#include
#include
std::vector vec;
std::mutex mtx;
void addNumbers(int start, int end) {
for (int i = start; i <= end; ++i) {
std::lock_guard lock(mtx); // 自动加锁和解锁
vec.push_back(i);
}
}
int main() {
std::thread t1(addNumbers, 0, 49);
std::thread t2(addNumbers, 50, 99);
t1.join();
t2.join();
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
注意这里std::lock_guard的用法——它利用RAII机制,出了作用域就自动释放锁,比手动lock/unlock安全得多。当然,如果你对性能有极致要求,也可以考虑更精细的读写锁或原子操作。
如果你需要更底层的控制——比如手动设置线程属性、绑定CPU核心、控制信号处理——那就得回到POSIX线程库。它虽然粗糙,但灵活度最高,很多老牌服务器软件就是这么干的。
#include
#include
void* helloFunction(void* arg) {
std::cout << "Hello from a thread!" << std::endl;
return nullptr;
}
int main() {
pthread_t thread;
pthread_create(&thread, nullptr, helloFunction, nullptr);
pthread_join(thread, nullptr); // 等待线程完成
return 0;
}
看到没,pthread的创建函数参数是一堆裸指针,返回值也是void*。好处是你几乎能控制一切,坏处是出错概率也高了。新手容易在资源清理上翻车,务必检查pthread_create的返回值。
在CentOS上编译这些程序,推荐用g++。注意要指定C++11标准并链接pthread库:
g++ -std=c++11 -pthread your_program.cpp -o your_program
./your_program
两个关键参数:
-std=c++11:让编译器认C++11的、等新特性。-pthread:链接POSIX线程库,否则标准库底层的pthread调用会报错。最后提一句:以上四种方法并不是互斥的,实际项目里经常混用。比如用std::thread处理轻量任务,用std::async接复杂计算结果,再配合std::mutex保护共享状态。选哪种,取决于你的场景和习惯——没有银弹,只有最适合的方案。
上一篇:CentOS上C++程序如何监控
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8