2016-01-18 4 views
2


У меня есть 2 файла, и я хочу, чтобы каждое ядро ​​считывало его собственный файл (каждый файл имеет 5 строк) и отображает его содержимое
в этом коде У меня есть 2 ядра (core0, core1) 0 читайте содержимое ядра1 (5 строк). и core1 читал 4 строки из своего контента.Чтение двух разных файлов одновременно

Я попытался сделать это так, как если бы остальные условия, и у каждого файла есть свой собственный читатель, но та же проблема все еще существует. Что мне делать?

#include <vector> 
#include <stdio.h> 
#include <time.h> 
#include <mpi.h> 
#include <omp.h> 
#include <fstream> 
#include <iostream> 
using namespace std; 


void func2(int CoreID) 
{ 

    int iFace; 
    int iFaces=0; 
    if (CoreID==0) 
    { 
     FILE* imgListFile = 0; 
     char imgFilename[5012]; 
     char actualPath[90]="C:\\DaliaDaliaSh\\TrainingFiles\\File10img_0_C"; 
     strcat(actualPath , "0.txt"); 
     imgListFile= freopen(actualPath , "r",stdin); 
     while (fgets(imgFilename, 5012, imgListFile)) 
     { 
      ++iFaces; 
      printf("** Core = %d , Path = %s\n" , CoreID , imgFilename); 

     } 
     rewind(imgListFile); 
    } 
    else if (CoreID==1) 
    { 
     FILE* imgListFile2 = 0; 
     char imgFilename2[5012]; 
     char actualPath2[90]="C:\\DaliaDaliaSh\\TrainingFiles\\File10img_0_C"; 
     strcat(actualPath2 , "1.txt"); 
     imgListFile2= freopen(actualPath2 , "r",stdin); 
     while (fgets(imgFilename2, 5012, imgListFile2)) 
     { 
      ++iFaces; 
      printf("** Core = %d , Path = %s\n" , CoreID , imgFilename2); 

     } 
     rewind(imgListFile2); 
    } 


    //printf ("*ID = %d open actualPath= %s\n" , myId , actualPath); 


    printf("core %d , iFaces= %d \n", CoreID , iFaces); 
} 
void main(int argc,char **argv) 
{ 
    MPI::Init(argc,argv); 
    int threadnum=2; 
    omp_set_num_threads(threadnum); 

#pragma omp parallel 
    { 

     int CoreID = omp_get_thread_num(); 
     int x ; 

     func2(CoreID); 

     cout <<"@@@@after call func inside pragma \n" ; 

    } 


    MPI ::Finalize(); 
} 
+1

Это может быть полезно, http://stackoverflow.com/a/11096742/5781248 –

+1

Не уверен, что я понял ваш вопрос правильно, но я вижу состояние гонки при выполнении printf. Это необходимо защитить с помощью функции mutex/std :: unique_lock/или какой-либо другой блокировки. – Arunmu

+0

Большое спасибо за ваши комментарии :) –

ответ

2

Вы делаете freopen на stdin. Таким образом, оба ядра будут использовать один и тот же поток, и чтение файла будет зависеть от того, какое ядро ​​открыло поток первым/последним [который является условием гонки].

ли регулярные fopen вместо этого и они не будут конфликтовать [как они делают сейчас]

+0

Yesssssss, It works (Y) (Y) Спасибо большое :) –

+0

Добро пожаловать. Счастливое программирование! –

Смежные вопросы