www.pudn.com > Genecircus20070919.rar > Mutlithread_boost.cpp
#include "Mutlithread_boost.h"
Mutlithread_boost::Mutlithread_boost(void)
{
}
Mutlithread_boost::~Mutlithread_boost(void)
{
}
void count(int i,int j,int obj, Mutlithread_boost * parent)
{
int number = parent->calu_mi->number;//gene_matrix->micro_set[0].a_micro.size();
Pair_Vector gene_pairs_temp_for_thread;
double ** prob_table;
double * norm_1D_table;
double ** norm_2D_table;
prob_table = new double * [number];
for ( i = 0; i < number; i++ )
{
prob_table[i] = new double[number];
for ( int j = 0; j < number; j++ )
{
prob_table[i][j] = -1.0;
}
}
norm_1D_table = new double[number];
norm_2D_table = new double * [number];
for ( int p = 0; p < number; p++ )
{
norm_2D_table[p] = new double[number];//calculatemi->
}
memcpy(prob_table,parent->calu_mi->prob_table,number*number*sizeof(double));
memcpy(norm_1D_table,parent->calu_mi->norm_1D_table,number*sizeof(double));
memcpy(norm_2D_table,parent->calu_mi->norm_2D_table,number*number*sizeof(double));
while(i <= j )
{
if(i != obj)
parent->calu_mi->get_GenePairs_Mi(obj,i,gene_pairs_temp_for_thread,prob_table,norm_1D_table,norm_2D_table);
i++;
}
if(gene_pairs_temp_for_thread.size() != 0){
gene_pairs_temp_for_thread.clear();
}
if(prob_table != NULL){
for ( int i = 0; i < number; i++ )
{
delete[] prob_table[i];
delete[] norm_2D_table[i];
}
delete[] prob_table;
delete[] norm_2D_table;
delete[] norm_1D_table;
}
}
void Mutlithread_boost::do_calu_mi(int index,int index_end,int obj/*i,j*/)
{
int a = this->Core_number;
int step_long = (index_end-index+1)/a;
if(step_long < 1){
step_long = 1;
}
while(a > 0){
if(index + step_long < index_end)
threads.create_thread(boost::bind(&count, index, index + step_long, obj, this));
else{
threads.create_thread(boost::bind(&count, index, index_end-1, obj, this));
}
index = index + step_long +1;
a--;
}
threads.join_all();
}