21xrx.com
2024-12-22 18:12:49 Sunday
登录
文章检索 我的文章 写文章
C++线程实现:从入门到精通
2023-07-11 10:19:20 深夜i     --     --
C++ 线程 入门 精通 实现

C++作为一门广泛应用于软件开发的高级编程语言,其使用率相对较高,被广泛应用于编写桌面应用程序、嵌入式程序以及游戏等。线程作为一种常用的多任务处理方式,也被广泛应用于各种软件项目中。

C++线程实现极为重要,它可以让程序快速同时执行多个任务。线程是程序的基本执行单元,它可以作为一个“轻量级”的进程存在于操作系统中,共享同一个地址空间。下面,我们将从入门到精通C++线程实现。

1、了解线程的概念

线程是CPU的操作单位,通过多线程并行执行,可以实现程序的最大化执行效率。在C++中,通过创建并启用多个线程,可以将一些大型的任务分解成小的子任务并发执行。线程可以使用C++标准库中的thread类和mutex类实现。

2、学习thread类的基本用法

thread类是C++标准库中用来实现线程的一种类,它提供了创建线程、暂停线程、等待线程等基本方法。C++中通过线程对象的构造函数来创建线程,例如:


#include <thread>

void func()

  //子线程要执行的操作

int main(){

  std::thread th(func); //创建一个新的子线程

  th.join(); //等待子线程执行完

  return 0;

}

通过以上代码就可以创建一个新的子线程,并通过join函数等待该线程执行完毕。

3、编写线程安全的代码

线程安全的代码是指多个线程并发执行时不会导致数据竞争或其他问题的代码。在C++中,通过mutex类可以实现线程安全的代码。mutex类用于管理线程对共享资源的并发访问,同一时间只允许一个线程对共享资源进行访问,例如:


#include <mutex>

#include <thread>

#include <iostream>

std::mutex g_mutex;

void func(int id){

  g_mutex.lock();

  std::cout << "Thread " << id << " is working..." << std::endl;

  g_mutex.unlock();

}

int main(){

  std::thread th1(func, 1);

  std::thread th2(func, 2);

  th1.join();

  th2.join();

  return 0;

}

通过上述代码,我们使用mutex类实现了线程之间对共享资源的互斥访问,确保线程安全的执行。

4、利用C++实现多线程数据处理

多线程数据处理是C++中常用的一种多线程编程模式,它可以将数据分成多个部分进行处理。例如,我们可以使用线程池来管理多个线程一起处理数据,例如:


#include <iostream>

#include <vector>

#include <thread>

#include <cmath>

#include <iomanip>

#include <algorithm>

#include <chrono>

std::mutex g_mutex;

//计算素数

void func(int start, int end, std::vector<int>& output){

  for (int i = start; i <= end; i ++){

    bool isPrime = true;

    for (int j = 2; j <= sqrt(i); j ++)

      if (i % j == 0)

        isPrime = false;

        break;

      

    if (isPrime){

      g_mutex.lock();

      output.push_back(i);

      g_mutex.unlock();

    }

  }

}

int main(){

  int start = 1, end = 2000000;

  std::vector<int> output;

  int numberOfThreads = std::thread::hardware_concurrency(); //获取计算机CPU核心数量

  std::vector<std::thread> threads;

  auto startTime = std::chrono::high_resolution_clock::now(); //开始时间

  //划分数据,启动线程

  for (int i = 0; i < numberOfThreads; i ++){

    threads.push_back(std::thread(func, start + i * ((end - start) / numberOfThreads), start + (i + 1) * ((end - start) / numberOfThreads), std::ref(output)));

  }

  //等待所有线程执行完毕

  for (int i = 0; i < numberOfThreads; i ++)

    threads[i].join();

  auto endTime = std::chrono::high_resolution_clock::now(); //结束时间

  std::chrono::duration<double> totalTime = endTime - startTime; //计算总时间

  //输出结果

  std::sort(output.begin(), output.end());

  for (int i = 0;i < output.size(); i ++)

    std::cout << output[i] << " ";

  std::cout << std::endl << std::fixed << std::setprecision(3) << "Total Time: " << totalTime.count() << "s" << std::endl;

  return 0;

}

上述代码就是使用C++实现多线程数据处理的一个例子,通过该代码可以看出如何将数据划分并分配到多个线程中进行并发处理,从而提高代码执行效率。

总之,C++线程实现是C++中常用的一种多线程编程模式,掌握其基本用法并编写线程安全的代码可以提高代码运行效率。 使用以上技巧,从入门到精通C++线程实现,并在实际应用中取得高效的表现。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复