服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C++中的多线程编程:一种高效的并发处理方式

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

2023-10-24 09:26鲨鱼编程 C/C++

本文将介绍C++中的多线程编程,包括创建线程、同步线程、传递数据给线程以及异常处理等方面。

 一、引言

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

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

 

二、创建线程

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

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

 

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

三、同步线程

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

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

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

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

四、传递数据给线程

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

#include   
#include   
#include   
  
void print_squared(int x) {  
    std::cout << "Squared: " << x * x << std::endl;  
}  
  
int main() {  
    int x = 5;  
    std::future result = std::async(std::launch::async, print_squared, x);  
    result.wait(); // 等待线程结束  
    return 0;  
}

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

五、异常处理

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

#include   
#include   
#include   
  
void threadFunction() {  
    try {  
        throw std::runtime_error("An error occurred");  
    } catch (const std::exception& e) {  
        std::cout << "Caught exception: " << e.what() << std::endl;  
    }  
}  
  
int main() {  
    std::thread newThread(threadFunction);  // 创建一个新线程,函数为 threadFunction  
    newThread.join();  // 等待新线程结束  
    return 0;  
}

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

六、结论

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

原文地址:https://mp.weixin.qq.com/s?__biz=Mzg4Mjg0MTA3Ng==&mid=2247486623&idx=1&sn=e1f35fab380224a080b34524b366309e&chksm=cf51c804f8264112385fafab3c1b31b981cd01270d0ae33723b6aa595528ddbb93fb003eaf92

延伸 · 阅读

精彩推荐
  • C/C++基于Matlab绘制洛伦兹吸引子相图

    基于Matlab绘制洛伦兹吸引子相图

    洛伦兹吸引子(Lorenz attractor)是由MIT大学的气象学家Edward Lorenz在1963年给出的。本文将利用Matlab实现洛伦兹吸引子相图的绘制,感兴趣的可以了解一下...

    slandarer4432022-11-07
  • C/C++C++软件添加dump调试打印日志(推荐)

    C++软件添加dump调试打印日志(推荐)

    下面小编就为大家带来一篇C++软件添加dump调试打印日志(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    C++教程网11132021-04-12
  • C/C++C语言深入探究sizeof与整型数据存储及数据类型取值范围

    C语言深入探究sizeof与整型数据存储及数据类型取值范围

    在main函数中,sizeof是可以正常工作的,但是在自定义函数中就不可以了。所以本文将为大家详细讲解一下关键字sizeof、整型数据存储深入、数据类型取值范...

    龙兆万10982023-02-23
  • C/C++C++ OpenCV实战之车道检测

    C++ OpenCV实战之车道检测

    这篇文章主要介绍了基于C++ OpenCV实现的车道检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Zero___Chen4582022-09-01
  • C/C++浅谈C++11新引入的lambda表达式

    浅谈C++11新引入的lambda表达式

    Lambda表达式(又称Lambda函数,英文原文是Lambda Expression),是C++11的新特性中非常实用的一个。...

    lenomirei4652021-05-26
  • C/C++C语言实现简单的井字棋游戏

    C语言实现简单的井字棋游戏

    这篇文章主要为大家详细介绍了C语言实现简单的井字棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    肖舎6172021-11-03
  • C/C++Qt实现闹钟小程序

    Qt实现闹钟小程序

    这篇文章主要为大家详细介绍了Qt实现闹钟小程序,利用Qt的designer设计需要的闹钟界面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    飘云之下10432021-08-01
  • C/C++C++实现LeetCode(47.全排列之二)

    C++实现LeetCode(47.全排列之二)

    这篇文章主要介绍了C++实现LeetCode(47.全排列之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下...

    Grandyang1292021-11-26