• C++中的多线程编程:高效的并发处理方式


    一、引言

    随着硬件的发展和应用的复杂性增加,并发处理成为了一种基本需求。多线程编程是一种实现并发处理的有效方式,C++11开始引入了 库,使得多线程编程更加容易和高效。本文将介绍C++中的多线程编程,包括创建线程、同步线程、传递数据给线程以及异常处理等方面。

    二、创建线程

    在C++中,可以使用 std::thread 类来创建一个新线程。例如:

    1. #include
    2. #include
    3. void threadFunction() {
    4. std::cout << "Hello from the new thread!" << std::endl;
    5. }
    6. int main() {
    7. std::thread newThread(threadFunction); // 创建一个新线程,函数为 threadFunction
    8. newThread.join(); // 等待新线程结束
    9. return 0;
    10. }

    在上面的代码中,我们定义了一个名为 threadFunction 的函数,并在 main 函数中创建了一个新的线程来执行这个函数。调用 std::thread 的 join 方法会阻塞主线程,直到新线程执行完毕。

    三、同步线程

    在多线程编程中,同步是一个重要的问题。如果多个线程同时访问和修改同一数据,可能会导致数据不一致的问题。为了解决这个问题,C++提供了几种同步原语,如std::mutex、std::lock_guard和std::condition_variable。

    下面是一个使用std::mutex和std::lock_guard进行线程同步的例子:

    1. #include <iostream>
    2. #include <thread>
    3. #include <mutex>
    4. std::mutex mtx; // 全局互斥锁。
    5. void print_id() {
    6. std::lock_guard<std::mutex> lck(mtx); // 锁定互斥锁。
    7. // 在锁定期间,只有一个线程可以访问下面的代码,其他线程将被阻塞,直到这个锁被释放。
    8. std::cout << "Hello from " << std::this_thread::get_id() << '\n';
    9. }
    10. int main() {
    11. std::thread threads[10]; // 创建多个线程执行 print_id()函数。
    12. for (int i = 0; i < 10; ++i) {
    13. threads[i] = std::thread(print_id); // 创建新线程执行 print_id 函数
    14. }
    15. for (auto& thread : threads) {
    16. thread.join(); // 等待所有线程执行完毕
    17. }
    18. return 0;
    19. }

    在这个例子中,我们创建了10个线程,每个线程都执行print_id函数。在print_id函数中,我们使用std::lock_guard来锁定互斥锁。这样,只有一个线程可以访问被保护的代码块,其他线程将被阻塞,直到这个锁被释放。通过这种方式,我们可以确保每个线程都能按顺序执行,避免了并发访问和修改同一数据的问题。

    四、传递数据给线程

    除了函数,我们还可以向线程传递数据。在C++中,我们可以将数据封装在std::future或std::async返回值中,然后传递给线程。例如:

    1. #include <iostream>
    2. #include <thread>
    3. #include <future>
    4. void print_squared(int x) {
    5. std::cout << "Squared: " << x * x << std::endl;
    6. }
    7. int main() {
    8. int x = 5;
    9. std::future<void> result = std::async(std::launch::async, print_squared, x);
    10. result.wait(); // 等待线程结束
    11. return 0;
    12. }

    在这个例子中,我们将x作为参数传递给线程,然后在线程中计算x的平方并打印结果。

    五、异常处理

    在多线程编程中,异常处理是一个重要的问题。在C++中,我们可以在线程函数中使用try/catch块来处理异常。例如:

    1. #include <iostream>
    2. #include <thread>
    3. #include <exception>
    4. void threadFunction() {
    5. try {
    6. throw std::runtime_error("An error occurred");
    7. } catch (const std::exception& e) {
    8. std::cout << "Caught exception: " << e.what() << std::endl;
    9. }
    10. }
    11. int main() {
    12. std::thread newThread(threadFunction); // 创建一个新线程,函数为 threadFunction
    13. newThread.join(); // 等待新线程结束
    14. return 0;
    15. }

    在这个例子中,我们在线程函数中抛出一个异常,然后在主线程中捕获并处理这个异常。

    六、结论

    多线程编程是现代计算机科学中的一个重要概念。在C++中,我们可以使用std::thread和相关的类和函数来实现多线程编程。通过使用这些工具,我们可以创建高效的并发程序,从而更好地利用硬件资源并提高程序的性能。

    相关领域拓展

    低代码开发是近年来在网络开发领域备受关注的一个趋势。低代码开发是指使用最少的编程代码来开发应用程序或业务逻辑,这使得即使是没有IT或编程经验的初学者也能快速创建所需的功能。

    虽然低代码开发还没有威胁到传统开发者的角色,但不可否认的是,这种趋势正在向低代码(或无代码)开发发展。据美国研究公司Gartner预测,到2024年,约65%的应用开发项目将通过低代码平台开发。这个趋势对于开发者来说是不容忽视的,预计未来几年开发者的工作方式也将逐渐发生变化。

    这几年隐约碰过低代码,目前比较热门,很多大厂都相继加入。

    到底啥是低代码,在我看来就是拖拉拽,呼呼呼,一通操作,搞出一套能跑的系统,前端,后端,数据库,一把完成。当然这可能是最终目标。

    链接:http://www.jnpfsoft.com/?csdn,如果你感兴趣,也体验一下。

    JNPF的优势就在于它能生成前后台代码,提供了极大的灵活性,能够创建更复杂、定制化的应用。它的架构设计也让开发者无需担心底层技术细节,能够专注于应用逻辑和用户体验的开发。

  • 相关阅读:
    方差和标准差哪些事儿
    go 学习 之 HTTP微服务示例
    Leetcode 2862. Maximum Element-Sum of a Complete Subset of Indices
    Collections工具类
    密码加密解密之路
    035——从GUI->Client->Server->driver实现SPI控制DAC芯片
    【Zookeeper专题】Zookeeper经典应用场景实战(二)
    本文是对优雅草蜻蜓C影视便捷追剧小程序微信支付配置教程-大部分小程序支付通用,从微信配置到后台的详解,其他小程序系统均可参考
    PEG/蛋白Prote/抗体antibody/PAA/SiO2功能化 修饰NaY(Gd/Lu/Nd):Yb,Tm@NaYF4:Yb,Nd上转换纳米颗粒
    [羊城杯 2020]black cat - 文件隐写+RCE(hash_hmac绕过)
  • 原文地址:https://blog.csdn.net/Z__7Gk/article/details/134012460