将多个线程的进度输出到控制台

时间:2014-01-31 13:22:29

标签: c++ multithreading console

我有一个程序正在执行由boost :: threadpool调度的'赋值'。这些任务中的每一项都需要花费大量时间(每项任务1分钟 - 5小时)。我不想监控每项任务的进度,了解这个过程需要多长时间。

有更多的任务,然后有线程,因此只有NUM_THREADS进度输出应该是可见的。

我已经创建了一段简单的代码,但有2个问题:

  • 我觉得它不优雅。
  • 不知道这样增加prog是否安全。

这样做的更好方法是什么?


#include <thread>
#include <iostream>
#include <atomic>
#include <vector>


volatile int prog[4]={0,0,0,0};
std::atomic<bool> prog_lock[4];

bool end(){
  bool ret=true;
  for(int i=0;i<4;i++)
    if(prog[i]!=100){
      ret=false;
      break;
    }

  return ret;

}
void Func(){

  int prog_ind=0;
  for(int i=0;i<4;i++){
    if(!prog_lock[i].exchange(true)){
      prog_ind=i;
      break;
    }
  }

  for(int i=0;i<100;i++){
    prog[prog_ind]++;
    std::this_thread::sleep_for(std::chrono::milliseconds(300));

  }
  prog_lock[prog_ind].store(false);

}


int main(){
  for(int i=0;i<4;i++)
    prog_lock[i].store(false);

  std::vector<std::thread> thr;
  for(int i=0;i<4;i++){
    thr.push_back(std::thread(Func));
  }

  while(!end()){
    std::cout << std::string(50,' ')  << "\r";
    for(int i=0;i<4;i++){

      std::cout << "Progress: " << prog[i] << "/100\t";
    }
    std::cout << "\r" << std::flush;
    std::this_thread::sleep_for(std::chrono::seconds(1));
  }
  for(int i=0;i<4;i++)
    thr[i].join();

}

0 个答案:

没有答案