我正在制作一个脚本,它遍历 fasta 文件的所有染色体并将其拆分为 10 bp 的片段,该函数称为 chrdata,我将这些片段保存到一个文件中。这种碎片可能发生在每个染色体上,与其他染色体完全分开,因此我正在尝试线程。
chrdata(faidx_t *seq_ref ,int chr_no,FILE *fp)
我的目标是希望加快这个过程。为了实现这一点,我尝试了使用 std::thread 函数的多线程。
我尝试过不同的东西。
- 首先,我尝试为第一个染色体创建一个线程,然后创建 thread.join(),然后为下一个染色体创建下一个线程,依此类推。
- 然后我尝试一次创建多个线程,就像使用 <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