使用 std::thread 并连接并行

问题描述

我正在制作一个脚本,它遍历 fasta 文件的所有染色体并将其拆分为 10 bp 的片段,该函数称为 chrdata,我将这些片段保存到一个文件中。这种断裂可能发生在每个染色体上,对于其他染色体来说完全分开,因此我正在尝试线程。 chrdata(faidx_t *seq_ref,int chr_no,FILE *fp) 我的目标是希望使这个过程更快。为了实现这一点,我尝试使用 std::thread 函数进行多线程。

我尝试过不同的东西。

  1. 首先,我尝试为第一个染色体创建一个线程,然后为 thread.join() 然后为下一个染色体创建下一个线程,依此类推。
  2. 然后我尝试一次创建多个线程,如Simultaneous Threads in C++ using <thread>中所述 这是下面的示例。

然而,据我所知,我可以阅读,我总是需要使用 join 否则我最终会“在没有活动异常的情况下终止调用”。问题是示例 (1) 和 (2) 之间没有时间执行差异。

根据我的理解,尽管使用线程对象创建一个向量,但它们仍然必须加入并等待所有线程执行。这意味着这将是并发执行而不是并行。

所以我的问题是:有人能给我建议下面的函数,我可能会改变以通过使用并行执行来加快执行速度吗?

或者在这种情况下我对 join 和 concurrent 的理解是错误的?我不完全确定为什么我们不能跳过整个连接部分,如果所有线程都完成了,为什么我们不能只使用 detach()?

void function(const char* fastafile,FILE *fp,int thread_no) {
  std::vector<std::thread> threads;
  //extracting the chromosome file
  faidx_t *seq_ref = NULL;
  seq_ref  = fai_load(fastafile);
  assert(seq_ref!=NULL);
  
  int chr_total = 10; //just the first 10 chromosomes
  int chr_idx = 0;
  int chr_no = 0;

  while(chr_idx < chr_total){
    for (chr_no; chr_no < std::min(chr_idx+thread_no,chr_total);chr_no++){
      threads.push_back(std::thread(chrdata,seq_ref,chr_no,fp));
    }
    for (auto &th : threads) { th.join(); }
    threads.clear();
    chr_idx = chr_idx + thread_no;
  }
}

我没有攻击 main() 或 chrdata() 以使代码和问题更清晰。

pastebin.com/iY6u9CbH

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)