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