問題: いくつかのテキスト ファイル (10 個) があり、すべての行に数字が含まれています。pthread ライブラリを使用して作成したいくつかのスレッドに分割する必要があります。作成されたこれらのスレッド (ワーカー スレッド) は、送信された最大の素数 (およびすべてのテキスト ファイルからの最大の素数) を見つけます。
解決策に関する私の現在の考え: 2 つの配列とすべてのテキスト ファイルを 1 つの配列に入れ、もう 1 つの配列には 1000 行と読み込んで、そのバイナリ ファイルのインデックスへのポインターを送信できるバイナリ ファイルを含めることを考えています。 ID、ファイルポインター、およびファイル位置を含む構造体で、それをクランクさせます。
私が話していることの少し:
pthread_create(&threads[index],NULL,workerThread,(void *)threadFields[index]);//Pass struct to each worker
構造:
typedef struct threadFields{
int *id, *position;
FILE *Fin;
}tField;
誰かが何か洞察やより良い解決策を持っているなら、それは大歓迎です
編集:わかりましたので、問題の解決策を見つけました.SaveTheRbtzが提案したものと似ていると思います. 私が実装したものは次のとおりです。ファイルを取得して 1 つのバイナリ ファイルにマージし、ループ内でそれを追跡しました (各エントリのバイト数を考慮する必要があり、これはハードコードされていました)。
struct threadFields *info = threadStruct;
int index;
int id = info->id;
unsigned int currentNum = 0;
int Seek = info->StartPos;
unsigned int localLargestPrime = 0;
char *buffer = malloc(50);
int isPrime = 0;
while(Seek<info->EndPos){
for(index = 0; index < 1000; index++){//Loop 1000 times
fseek(fileOut,Seek*sizeof(char)*20, SEEK_SET);
fgets(buffer,20,fileOut);
Seek++;
currentNum = atoi(buffer);
if(currentNum>localLargestPrime && currentNum > 0){
isPrime = ChkPrim(currentNum);
if( isPrime == 1)
localLargestPrime = currentNum;
}
}