86 lines
1.7 KiB
C
86 lines
1.7 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <pthread.h>
|
|
#include <string.h>
|
|
#define BUF_SIZE 2048
|
|
|
|
int **matrix;
|
|
int lines[100];
|
|
char filenames[2][10] = {"foo", "bar"};
|
|
|
|
int cmpfunc (const void * a, const void * b) {
|
|
return ( *(int*)a - *(int*)b );
|
|
}
|
|
|
|
int count_lines(FILE* file)
|
|
{
|
|
char buf[BUF_SIZE];
|
|
int counter = 0;
|
|
for(;;)
|
|
{
|
|
size_t res = fread(buf, 1, BUF_SIZE, file);
|
|
if (ferror(file))
|
|
return -1;
|
|
|
|
int i;
|
|
for(i = 0; i < res; i++)
|
|
if (buf[i] == '\n')
|
|
counter++;
|
|
|
|
if (feof(file))
|
|
break;
|
|
}
|
|
|
|
return counter;
|
|
}
|
|
|
|
|
|
void *sort(void * vargs) {
|
|
int num = (int) vargs;
|
|
|
|
FILE * fin = fopen(filenames[num], "r");
|
|
lines[num] = count_lines(fin);
|
|
fseek(fin,0L,SEEK_SET);
|
|
matrix[num] = malloc(lines[num]*sizeof(int));
|
|
for (int i = 0; i < lines[num]; i++) fscanf(fin, "%d", &matrix[num][i]);
|
|
fclose(fin);
|
|
|
|
qsort(matrix[num], lines[num], sizeof(int), cmpfunc);
|
|
return NULL;
|
|
}
|
|
|
|
int main(int argc, char ** argv) {
|
|
pthread_t tids[2];
|
|
int tmp[1000], res[1000], cur_len;
|
|
matrix = malloc(2*sizeof(int *));
|
|
|
|
pthread_create(&tids[0], NULL, sort, (void *)0);
|
|
pthread_create(&tids[1], NULL, sort, (void *)1);
|
|
|
|
for (int i = 0; i<2; i++) {
|
|
pthread_join(tids[i], NULL);
|
|
|
|
if (i == 0) {
|
|
memcpy(res, matrix[i], sizeof(int)*lines[i]);
|
|
cur_len = lines[i];
|
|
continue;
|
|
}
|
|
|
|
int a = 0, b = 0, j = 0;
|
|
while (a<cur_len && b<lines[i]) {
|
|
tmp[j++] = (res[a] > matrix[i][b]) ? matrix[i][b++] : res[a++];
|
|
}
|
|
while (a<cur_len) tmp[j++] = res[a++];
|
|
while (b<lines[i]) tmp[j++] = matrix[i][b++];
|
|
cur_len += lines[i];
|
|
memcpy(res, tmp, sizeof(int)*cur_len);
|
|
}
|
|
|
|
for (int i = 0; i<cur_len;i++) {
|
|
printf("%d ",res[i]);
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|