提高程序运行效率的有效方法——C++多线程编程

一、多线程基础知识

1、C++11的多线程库

C++11标准引入了对多线程的支持,它定义了<thread>头文件以及std::thread类,可以方便地进行线程创建、结束、等待等操作。下面是一个简单的示例:

#include <iostream>
#include <thread>

void hello()
{
    std::cout << "Hello World!<br>" << std::endl;
}

int main()
{
    std::thread t(hello);
    t.join();
    return 0;
}

2、线程间的数据共享

多线程编程中,不同线程之间需要共享数据,但共享数据容易引起线程安全问题,需要使用互斥量std::mutex来进行保护。

#include <iostream>
#include <thread>
#include <mutex>

std::mutex mu;
int g_count = 0;

void increment()
{
    mu.lock();
    ++g_count;
    mu.unlock();
}

int main()
{
    std::thread t1(increment);
    std::thread t2(increment);
    t1.join();
    t2.join();

    std::cout << "g_count = " << g_count << std::endl;
    return 0;
}

二、多线程优化策略

1、任务分解

将大任务分成多个小任务,每个小任务由一个线程执行,通过这种方式可以提高程序的整体处理速度。

#include <iostream>
#include <thread>
#include <vector>
#include <cmath>

const int N = 1000000;

void calculate(int start, int end, double* result)
{
    for(int i = start; i < end; ++i)
    {
        result[i] = sqrt(i);
    }
}

int main()
{
    double* result = new double[N];
    std::vector<std::thread> threads;
    const int thread_count = std::thread::hardware_concurrency();
    const int block_size = N / thread_count;

    for(int i = 0; i < thread_count; ++i)
    {
        int start = i * block_size;
        int end = (i == thread_count-1) ? N : (i+1) * block_size;
        threads.push_back(std::thread(calculate, start, end, result));
    }

    for(auto& t : threads)
    {
        t.join();
    }

    delete[] result;
    return 0;
}

2、避免不必要的复制

多线程程序中,有时需要传递大量数据到线程执行的函数中,如果直接传递这些数据,会造成大量的复制开销,可以通过使用指针或引用的方式,减小函数参数的复制。

#include <iostream>
#include <thread>
#include <cstring>
#include <cstdlib>

void worker(const char* str)
{
    char* s = (char*)malloc(sizeof(str)+1);
    std::strcpy(s, str);
    std::cout << "Thread " << std::this_thread::get_id() << " : " << s << std::endl;
    free(s);
}

int main()
{
    const char* str = "Hello World!";
    std::thread t(worker, str);
    t.join();
    return 0;
}

三、多线程应用场景

1、网络编程

网络编程中,需要同时处理多个客户端的请求,通过多线程可以提高服务器的并发处理性能。

//Server代码
#include <iostream>
#include <thread>
#include <chrono>
#include <string>
#include <cstring>
#include <vector>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

const int PORT = 8888;
int server_fd = 0, client_fd = 0;
bool is_running = true;
std::vector<std::thread> threads;

void client_thread(int fd)
{
    char buffer[1024];
    struct sockaddr_in client_addr;
    socklen_t client_addr_len = sizeof(client_addr);
    while(is_running)
    {
        memset(buffer, 0, sizeof(buffer));
        int n = recvfrom(fd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &client_addr_len);
        if(n == -1) continue;
        //处理客户端请求
        std::cout << "Thread " << std::this_thread::get_id() << " : receive message from " << inet_ntoa(client_addr.sin_addr) << " : " << ntohs(client_addr.sin_port) << ", message:" << buffer << std::endl;
    }
}

void init_server()
{
    server_fd = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
    listen(server_fd, 10);
    std::cout << "Server start ..." << std::endl;

    while(is_running)
    {
        client_fd = accept(server_fd, NULL, NULL);
        std::thread t(client_thread, client_fd);
        threads.push_back(std::move(t));
    }

    for(auto& t : threads)
    {
        if(t.joinable()) t.join();
    }
}

void stop_server()
{
    is_running = false;
    close(client_fd);
    close(server_fd);
}

int main()
{
    std::thread t(init_server);
    getchar();
    stop_server();
    t.join();
    return 0;
}

2、数据处理

数据处理中,经常需要进行大量的计算、排序、查找等操作,通过多线程可以加快计算速度。

#include <iostream>
#include <thread>
#include <vector>
#include <algorithm>
#include <random>

const long long N = 100000000000;
const int block_size = 1000000;
std::vector<std::thread> threads;
double* a;

void calculate(int start, int end, double* result)
{
    for(long long i = start; i < end; ++i)
    {
        result[i] = sqrt(i);
    }
}

int main()
{
    a = new double[N];

    for(int i = 0; i < N; i += block_size)
    {
        int start = i;
        int end = (i + block_size < N) ? i + block_size : N;
        threads.push_back(std::thread(calculate, start, end, a));
    }

    for(auto& t : threads)
    {
        t.join();
    }

    std::sort(a, a+N);
    delete[] a;
    return 0;
}

四、结语

本文介绍了C++多线程编程的基础知识、优化策略和应用场景,但是多线程编程也有其困难和缺陷,需要开发者在使用时进行综合考虑。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/306134.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝的头像小蓝
上一篇 2025-01-02 12:00
下一篇 2025-01-02 12:00

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • Python程序文件的拓展

    Python是一门功能丰富、易于学习、可读性高的编程语言。Python程序文件通常以.py为文件拓展名,被广泛应用于各种领域,包括Web开发、机器学习、科学计算等。为了更好地发挥P…

    编程 2025-04-29
  • Python购物车程序

    Python购物车程序是一款基于Python编程语言开发的程序,可以实现购物车的相关功能,包括商品的添加、购买、删除、统计等。 一、添加商品 添加商品是购物车程序的基础功能之一,用…

    编程 2025-04-29
  • Python多线程读取数据

    本文将详细介绍多线程读取数据在Python中的实现方法以及相关知识点。 一、线程和多线程 线程是操作系统调度的最小单位。单线程程序只有一个线程,按照程序从上到下的顺序逐行执行。而多…

    编程 2025-04-29
  • 爬虫是一种程序

    爬虫是一种程序,用于自动获取互联网上的信息。本文将从如下多个方面对爬虫的意义、运行方式、应用场景和技术要点等进行详细的阐述。 一、爬虫的意义 1、获取信息:爬虫可以自动获取互联网上…

    编程 2025-04-29
  • Vb运行程序的三种方法

    VB是一种非常实用的编程工具,它可以被用于开发各种不同的应用程序,从简单的计算器到更复杂的商业软件。在VB中,有许多不同的方法可以运行程序,包括编译器、发布程序以及命令行。在本文中…

    编程 2025-04-29
  • Python一元二次方程求解程序

    本文将详细阐述Python一元二次方程求解程序的相关知识,为读者提供全面的程序设计思路和操作方法。 一、方程求解 首先,我们需要了解一元二次方程的求解方法。一元二次方程可以写作: …

    编程 2025-04-29
  • 如何使用GPU加速运行Python程序——以CSDN为中心

    GPU的强大性能是众所周知的。而随着深度学习和机器学习的发展,越来越多的Python开发者将GPU应用于深度学习模型的训练过程中,提高了模型训练效率。在本文中,我们将介绍如何使用G…

    编程 2025-04-29

发表回复

登录后才能评论