商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > CentOS上C++程序如何实现并发编程

CentOS上C++程序如何实现并发编程

  发布于2026-07-16 阅读(0)

扫一扫,手机访问

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

CentOS上C++程序如何实现并发编程

1. 多线程(Multithreading)

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()调用不能少,否则主线程跑完了子线程还没结束,程序就炸了。

2. 异步编程(Asynchronous Programming)

如果说多线程是直接派人干活,那就是“你忙你的,回头告诉我结果”。尤其适合那种需要等一会儿才能拿到值的场景,比如网络请求或复杂计算。

示例代码:

#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()时才执行。实际项目中怎么选?关键看你对并发粒度的要求。

3. 并发容器和算法

多线程最头疼的就是数据竞争。好在标准库给你备好了这些工具,配合并发容器,能让你的共享数据安全不少。下面这个例子演示了用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安全得多。当然,如果你对性能有极致要求,也可以考虑更精细的读写锁或原子操作。

4. POSIX线程(Pthreads)

如果你需要更底层的控制——比如手动设置线程属性、绑定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保护共享状态。选哪种,取决于你的场景和习惯——没有银弹,只有最适合的方案。

本文转载于:https://www.yisu.com/ask/30505328.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注