21xrx.com
2024-11-22 10:26:34 Friday
登录
文章检索 我的文章 写文章
C++多线程入门:从基础到实战
2023-06-23 05:24:10 深夜i     --     --
C++ 多线程 入门 基础 实战

C++是一种广泛使用的编程语言,也是许多应用程序的开发语言。当我们需要高度并发的应用程序时,多线程技术就非常重要了。在这篇文章中,我们将学习C++多线程的基本概念,以及如何在实际工程中应用多线程技术。

基本概念

什么是线程?线程是一个进程中的基本执行单元。每个线程都有独立的执行路径和状态。多个线程可以同时运行,在同一个程序中协调执行不同的任务。在多线程应用程序中,通常使用线程池/调度器完成线程的创建和分配。

为什么多线程?多线程可以保证CPU资源的最大化利用,提高程序运行效率,同时在某些非阻塞的情况下可以提升应用程序的响应能力。例如,一个网络请求被发送到服务器后,服务器不需要立即响应,此时可以让主线程继续处理其他任务,而让另一个线程排队等待服务器响应。

在C++中使用多线程技术,主要有三类方法:pthread、C++11标准线程和Windows API。

pthread是POSIX线程库的简称,是一种跨平台的线程库,可以在Linux、Unix等系统上使用。pthread库提供了一些统一的API函数来控制线程的创建和管理。

C++11标准线程是C++11标准引入的多线程库,在C++11标准之前,C++没有原生支持多线程技术。C++11标准线程库基于POSIX线程库,提供了一种C++式的线程接口。

Windows API也提供了多线程库的支持。在Windows系统下,我们可以使用Windows API来创建和管理线程。

实战

为了更好地理解C++多线程的应用,我们将介绍一个简单的例子:假设我们需要下载多个网页内容,并把这些内容存储在本地硬盘上。这是一个任务密集型的操作,可以考虑采用多线程技术来优化程序的运行效率。

在该例子中,我们需要完成以下任务:

1. 获取所有需要下载的网页链接

2. 为每个链接开启一个线程,下载链接对应的内容

3. 将下载好的内容写入本地文件

实现该例子的C++多线程代码如下:

#include

#include

#include

#include

#include

#include

#include

using namespace std;

// 需要下载内容的链接列表

vector urls = "https://www.example.com/1";

// 保护文件写入操作的互斥锁

mutex g_mutex;

// 写入文件的函数

void writeFile(const string& fileName, const string& content) {

  // 加锁,保证同一时间只有一个线程在写入文件

  lock_guard guard(g_mutex);

  ofstream fout(fileName);

  if (!fout)

    cerr << "open file failed" << endl;

    return;

  fout << content;

  fout.flush();

  fout.close();

}

// 下载单个链接并写入文件的函数

void downloadUrl(const string& url, const string& fileName) {

  CURL* curl;

  CURLcode res;

  string content;

  curl = curl_easy_init();

  if (curl) {

    curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, [](char* ptr, size_t size, size_t nmemb, string* data) -> size_t {

      data->append(ptr, size * nmemb);

      return size * nmemb;

    });

    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);

    res = curl_easy_perform(curl);

    if (res != CURLE_OK) {

      cerr << "curl_easy_perform() failed: " << curl_easy_strerror(res) << endl;

    }

    else {

      writeFile(fileName, content);

    }

    curl_easy_cleanup(curl);

  }

}

int main() {

  // 创建下载线程

  vector threads;

  string fileName;

  for (size_t i = 0; i < urls.size(); ++i) {

    fileName = "file" + to_string(i) + ".html";

    threads.emplace_back([url = urls[i], fileName = fileName] {

      downloadUrl(url, fileName);

    });

  }

  // 等待所有线程完成任务

  for (auto& t : threads) {

    if (t.joinable()) {

      t.join();

    }

  }

  // 完成所有任务,退出程序

  return 0;

}

在该例子中,我们使用了curl库来实现下载网页的功能,代码中还包含了文件写入操作的互斥锁,以确保同一时间只有一个线程在写入文件。

总结

C++多线程是一种很有用的技术,能够帮助我们最大限度地利用CPU资源,提高程序运行效率。在实际应用中,我们需要注意多线程带来的性能问题和线程安全问题,并选择合适的多线程API来实现程序设计。以上代码只是一个简单的示例,仅供参考,请仔细考虑实际应用需求后进行开发。

  
  
下一篇: VC++ 项目

评论区

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