Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/resource.h>
- #include <linux/types.h>
- #include <sys/wait.h>
- #define NAME "ANOVIKOV-LAB3.1"
- #define START_MEM 1024
- #define MAX 100
- #define THREADS 8
- unsigned int a=0,b=0,c=0,d=0;
- unsigned int K;
- pid_t *pids;
- struct equation {
- unsigned int a;
- unsigned int b;
- unsigned int c;
- unsigned int d;
- };
- struct equation **result;
- typedef unsigned long long uint64;
- // for prevent segmentation fault
- uint64 result_mem[THREADS];
- void print_data(unsigned int a, unsigned int b,
- unsigned int c, unsigned int d,
- int type)
- {
- printf("%i %i %i %i", a,b,c,d);
- if (type == 0)
- {
- printf(" a+b+c+d = %i", K);
- }else if(type == 1)
- {
- printf(" a-b+c-d = %i", K);
- }else if(type == 2)
- {
- printf(" a*b-c*d = %i", K);
- }
- printf("\n");
- }
- struct equation make_equation(unsigned int a, unsigned int b,
- unsigned int c, unsigned int d)
- {
- struct equation out = {a,b,c,d};
- return out;
- }
- int main(void)
- {
- int i;
- int index;
- int STEP = THREADS;
- K=1024;
- setbuf(stdout, NULL);
- pids = (pid_t*)malloc(sizeof(pid_t) * THREADS);
- result = (struct equation**)malloc(sizeof(struct equation *)*THREADS);
- for (i=0;i<THREADS;i++)
- {
- result[i] = (struct equation*)malloc(sizeof(struct equation) * START_MEM);
- result_mem[i] = START_MEM;
- }
- for(index=0;index<THREADS;index++)
- {
- pid_t p = fork();
- pids[index] = p;
- // variable for current array state
- uint64 arr_i=0;
- switch (p){
- case 0: // child
- {
- STEP = THREADS;
- for(a=0;a<MAX;a++)
- {
- for(b=0;b<MAX;b++)
- {
- for(c=0;c<MAX;c++)
- {
- for(d=index;d<MAX;d+=STEP)
- {
- // printf("%i %i %i %i\n", a,b,c,d);
- if (a+b+c+d == K)
- {
- if (result_mem[index] <= arr_i )
- {
- result[index] = realloc(result[index], sizeof(struct equation)*result_mem[index]*2);
- result_mem[index] *= 2;
- printf("pid: %i; mem: %lli\n", index, result_mem[index]);
- printf("\t%i %i %i %i\n", a,b,c,d);
- }
- result[index][arr_i++] = make_equation(a,b,c,d);
- print_data(a,b,c,d,0);
- }
- if (a-b+c-d == K)
- {
- if (result_mem[index] <= arr_i )
- {
- result[index] = realloc(result[index], sizeof(struct equation)*result_mem[index]*2);
- result_mem[index] *= 2;
- printf("pid: %i; mem: %lli\n", index, result_mem[index]);
- printf("\t%i %i %i %i\n", a,b,c,d);
- }
- result[index][arr_i++] = make_equation(a,b,c,d);
- print_data(a,b,c,d,1);
- }
- if (a*b-c*d == K)
- {
- if (result_mem[index] <= arr_i )
- {
- result[index] = realloc(result[index], sizeof(struct equation)*result_mem[index]*2);
- result_mem[index] *= 2;
- printf("pid: %i; mem: %lli\n", index, result_mem[index]);
- printf("\t%i %i %i %i\n", a,b,c,d);
- }
- result[index][arr_i++] = make_equation(a,b,c,d);
- print_data(a,b,c,d,2);
- }
- }
- }
- }
- }
- return 0; //similar to _exit(0)
- }
- default: //parent
- {
- }
- }
- }
- wait(NULL);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement