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(); 
}