[总结] C++ 知识点 《四》多线程相关

简介: [总结] C++ 知识点 《四》多线程相关

前言

以一个面试题为例子:

  1. 读取data.txt文件内容

  2. 使用多线程处理
  3. 使用宏定义线程数量

第一版实现:(面试时写得答案是这个类似)

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iostream>
#include <memory>
#include <thread>
#include <mutex>
#define MAX_SIZE 200*1024
#define MAX_THREAD_COUNT 10
int main() {
  FILE* pFile = fopen("D:\\workspace\\vs2015\\Project1\\Debug\\data.txt","rb");
  if (!pFile) {
    printf("file open error \n");
    return -1;
  }
  char szBuff[MAX_SIZE] = { 0 };
  int i = 0;
  while (!feof(pFile)) {
    fread(&szBuff[i * 1024], 1, 1024, pFile);
    i++;
  }
  fclose(pFile);    
  char szDoubleValue[8] = {0};
  int nDoubleValueIndex = 0;
  std::vector<double> vectDoubleList;
  for (size_t i = 0; i < strlen(szBuff); i++)
  {
    if (szBuff[i] == '\r') {
      float fValue = atof(szDoubleValue);
      vectDoubleList.push_back(fValue);
      //printf("%f\n", fValue);
      continue;
    }
    if (szBuff[i] == '\n') {
      nDoubleValueIndex = 0;
      memset(szDoubleValue, 0, 8);
      continue;
    }
    szDoubleValue[nDoubleValueIndex] = szBuff[i];
    nDoubleValueIndex++;
  }
  if (vectDoubleList.size() <= 0) {
    printf("vectDoubleList empty \n");
    return -1;
  }
  std::unique_ptr<std::thread> thThreadPtrList[MAX_THREAD_COUNT - 1];
  volatile int nHasProIndex = 0;
  double dTotalValue = 0;
  int size = vectDoubleList.size();
  std::mutex lock;
  long lStartTime = clock();
  for (size_t i = 0; i < MAX_THREAD_COUNT - 1; i++)
  {
    thThreadPtrList[i] = std::unique_ptr<std::thread>(
      new std::thread([&]() {
        while(1)
        {
          std::lock_guard<std::mutex> locker(lock);
          if (nHasProIndex != size) {
            dTotalValue += vectDoubleList[nHasProIndex];
            nHasProIndex++;
          }
          else {
            break;
          }
        }
      })
    );
  }
  while (1)
  {
    std::lock_guard<std::mutex> locker(lock);
    if (nHasProIndex != size) {
      dTotalValue += vectDoubleList[nHasProIndex];
      nHasProIndex++;
    }
    else {
      break;
    }
  }
  long lEndTime = clock();
  double dAvarageValue = dTotalValue / vectDoubleList.size();
  printf("Total Count:%d \nMedium Value:%f \nAvarage Value:%f \n", vectDoubleList.size(),vectDoubleList[vectDoubleList.size()/2], dAvarageValue);
  printf("Total Time:%d \n", lEndTime - lStartTime);
  for (size_t i = 0; i < MAX_THREAD_COUNT -1; i++)
  {
    thThreadPtrList[i]->join();
  }
  system("pause");
  return 0;
}

面试的大佬 给提了几个建议:

  1. 尽量不要用锁 (用户态转为内核态需要一些开销)
  2. 尽量不要裸指针,裸指针容易忘记销毁 异常捕获会被上层捕获 内存泄漏。

同时申明一点智能指针具有传递性,函数的形参也需要是智能指针。

  1. 尽量使用c++读取文件,虽然c原生比c++流 速度快。
  2. 尽量不要使用全局变量
  3. 主线程也要用上,这算小技巧
  4. 线程算法能优化,可以使用Google的map-reduces算法,类似根据线程数量把数据进行分段处理。

当时在ubuntu上编程的,很懵逼,线程库用不了,需要qt pro文件 添加 LIBS += pthread.lib


相关文章
|
监控 Java
JavaGuide知识点整理——线程池的最佳实践
总之,合理使用和配置线程池是提高 Java 程序性能和稳定性的重要手段。遵循最佳实践,可以更好地发挥线程池的作用,提升系统的运行效率。同时,要不断地进行监控和优化,以适应不同的业务需求和环境变化。
582 63
|
存储 消息中间件 资源调度
C++ 多线程之初识多线程
这篇文章介绍了C++多线程的基本概念,包括进程和线程的定义、并发的实现方式,以及如何在C++中创建和管理线程,包括使用`std::thread`库、线程的join和detach方法,并通过示例代码展示了如何创建和使用多线程。
238 1
C++ 多线程之初识多线程
|
存储 消息中间件 资源调度
「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识
该文章总结了操作系统基础知识中的十个关键知识点,涵盖了进程与线程的概念及区别、进程间通信方式、线程同步机制、死锁现象及其预防方法、进程状态等内容,并通过具体实例帮助理解这些概念。
「offer来了」进程线程有啥关系?10个知识点带你巩固操作系统基础知识
|
缓存 安全 C++
C++无锁队列:解锁多线程编程新境界
【10月更文挑战第27天】
1045 7
|
消息中间件 存储 安全
|
存储 并行计算 安全
C++多线程应用
【10月更文挑战第29天】C++ 中的多线程应用广泛,常见场景包括并行计算、网络编程中的并发服务器和图形用户界面(GUI)应用。通过多线程可以显著提升计算速度和响应能力。示例代码展示了如何使用 `pthread` 库创建和管理线程。注意事项包括数据同步与互斥、线程间通信和线程安全的类设计,以确保程序的正确性和稳定性。
382 5
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
660 6
|
缓存 负载均衡 Java
c++写高性能的任务流线程池(万字详解!)
本文介绍了一种高性能的任务流线程池设计,涵盖多种优化机制。首先介绍了Work Steal机制,通过任务偷窃提高资源利用率。接着讨论了优先级任务,使不同优先级的任务得到合理调度。然后提出了缓存机制,通过环形缓存队列提升程序负载能力。Local Thread机制则通过预先创建线程减少创建和销毁线程的开销。Lock Free机制进一步减少了锁的竞争。容量动态调整机制根据任务负载动态调整线程数量。批量处理机制提高了任务处理效率。此外,还介绍了负载均衡、避免等待、预测优化、减少复制等策略。最后,任务组的设计便于管理和复用多任务。整体设计旨在提升线程池的性能和稳定性。
374 5
|
Java Python
python知识点100篇系列(16)-python中如何获取线程的返回值
【10月更文挑战第3天】本文介绍了两种在Python中实现多线程并获取返回值的方法。第一种是通过自定义线程类继承`Thread`类,重写`run`和`join`方法来实现;第二种则是利用`concurrent.futures`库,通过`ThreadPoolExecutor`管理线程池,简化了线程管理和结果获取的过程,推荐使用。示例代码展示了这两种方法的具体实现方式。
320 0
python知识点100篇系列(16)-python中如何获取线程的返回值
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
363 0
C++ 多线程之线程管理函数

热门文章

最新文章