You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
1.7 KiB

#include <ulib.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MATSIZE 10
static int mata[MATSIZE][MATSIZE];
static int matb[MATSIZE][MATSIZE];
static int matc[MATSIZE][MATSIZE];
void
work(unsigned int times) {
int i, j, k, size = MATSIZE;
for (i = 0; i < size; i ++) {
for (j = 0; j < size; j ++) {
mata[i][j] = matb[i][j] = 1;
}
}
yield();
cprintf("pid %d is running (%d times)!.\n", getpid(), times);
while (times -- > 0) {
for (i = 0; i < size; i ++) {
for (j = 0; j < size; j ++) {
matc[i][j] = 0;
for (k = 0; k < size; k ++) {
matc[i][j] += mata[i][k] * matb[k][j];
}
}
}
for (i = 0; i < size; i ++) {
for (j = 0; j < size; j ++) {
mata[i][j] = matb[i][j] = matc[i][j];
}
}
}
cprintf("pid %d done!.\n", getpid());
exit(0);
}
const int total = 21;
int
main(void) {
int pids[total];
memset(pids, 0, sizeof(pids));
int i;
for (i = 0; i < total; i ++) {
if ((pids[i] = fork()) == 0) {
srand(i * i);
int times = (((unsigned int)rand()) % total);
times = (times * times + 10) * 100;
work(times);
}
if (pids[i] < 0) {
goto failed;
}
}
cprintf("fork ok.\n");
for (i = 0; i < total; i ++) {
if (wait() != 0) {
cprintf("wait failed.\n");
goto failed;
}
}
cprintf("matrix pass.\n");
return 0;
failed:
for (i = 0; i < total; i ++) {
if (pids[i] > 0) {
kill(pids[i]);
}
}
panic("FAIL: T.T\n");
}