0

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

我尝试过不同的东西。

  1. 首先,我尝试为第一个染色体创建一个线程,然后创建 thread.join(),然后为下一个染色体创建下一个线程,依此类推。
  2. 然后我尝试一次创建多个线程,就像使用 <thread> 在 C++ 中的同时线程中解释的那样, 这是下面的示例。

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

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

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

还是在这种情况下我对加入和并发的理解是错误的?我不完全确定为什么我们不能跳过整个连接部分,如果所有线程都完成了,为什么我们不能只使用 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

4

0 回答 0