C++多线程


#include <chrono>
#include <iostream>
#include <string>
#include <thread>
using namespace std;

void download(string file) {
  for (int i = 0; i < 10; i++) {
    cout << "Downloading " << file << " (" << i * 10 << "%)..." << endl;
    this_thread::sleep_for(chrono::milliseconds(400));
  }
  cout << "Download complete: " << file << endl;
}

void interact() {
  string name;
  cin >> name;
  cout << "Hi, " << name << endl;
}

int main() {
  // 开启一个子线程
  thread t1([&] { download("hello.zip"); });
  // 主线程阻塞等待输入
  interact();
  // t1执行结束前主线程不结束。
  t1.join();
  return 0;
}

在函数或方法中开启子线程

void myfunc(){
  thread t1([&] { download("hello.zip"); });
  t1.detach(); // 当函数执行结束时,函数中的对象会被销毁,detach()防止子线程被销毁
}
// 全局线程池
vector<thread> pool;
void myfunc() {
  thread t1([&] { download("hello.zip"); });
  // 将t1添加到全局线程池中,以延长t1的生命周期
  pool.push_back(move(t1));
}

int main() {
  myfunc();
  interact();
  // 遍历线程池
  for (auto &t : pool)
    t.join();
  return 0;
}
class ThreadPool {
public:
  void push_back(thread t) { pool.push_back(move(t)); }
  ~ThreadPool() {
    // 对象遍历线程池
    for (auto &t : pool)
      t.join();
  }
};

ThreadPool tpool;
void myfunc() {
  thread t1([&] { download("hello.zip"); });
  // 将t1添加到全局线程池中,以延长t1的生命周期
  tpool.push_back(move(t1));
}

int main() {
  myfunc();
  interact();
  return 0;
}