Пример #1
0
void sink(struct args *p) {
        Chan_T c = p->c;
        int i = 0, j, prime, primes[256];

        primes[0] = 0;
        while (Chan_receive(c, &prime, sizeof prime)) {
                for (j = 0; primes[j]; j++)
                        if (prime%primes[j] == 0)
                                break;
                if (primes[j] == 0) {
                        printf(" %d", prime);
                        primes[i++] = prime;
                        primes[i] = 0;
                        if (--p->nprime <= 0)
                                break;
                        if (i == p->n) {
                                fflush(stdout);
                                p->c = Chan_new();
                                Thread_new((int (*)(void *))sink, p, sizeof *p, NULL);
                                filter(primes, c, p->c);
                                return;
                        }
                }
        }
        printf("\n");
        Chan_receive(c, &prime, 0);
}
Пример #2
0
int sink(void* cl)
{
    struct args* p = cl;
    Chan_T input = p->c;
    int i = 0, j, x, primes[256];
    primes[0] = 0;

    for (;;) {
        Chan_receive(input, &x, sizeof x);

        for (j = 0; primes[j] != 0 && x % primes[j] != 0; j++)
            ;

        if (primes[j] == 0) {
            if (x > p->last) {
                break;
            }

            Fmt_print(" %d", x);
            primes[i++] = x;
            primes[i] = 0;

            if (i == p->n) {
                p->c = Chan_new();
                Thread_new(sink, p, sizeof * p, NULL);
                filter(primes, input, p->c);
                return EXIT_SUCCESS;
            }
        }
    }

    Fmt_print("\n");
    Chan_receive(input, &x, 0);
    return EXIT_SUCCESS;
}
Пример #3
0
int main(int argc, char *argv[]) {
        struct args args;

        Thread_init();
        args.c = Chan_new();
        Thread_new((int (*)(void *))source, &args, sizeof args, NULL);
        args.n      = argc > 2 ? atoi(argv[2]) : 5;
        args.nprime = argc > 1 ? atoi(argv[1]) : 100;
        Thread_new((int (*)(void *))sink,   &args, sizeof args, NULL);
        Thread_exit(0);
        return 0;
}
Пример #4
0
int main(int argc, char* argv[])
{
    struct args args;
    Thread_init(1, NULL);
    args.c = Chan_new();
    Thread_new(source, &args, sizeof args, NULL);
    args.n    = argc > 2 ? atoi(argv[2]) : 5;
    args.last = argc > 1 ? atoi(argv[1]) : 1000;
    Thread_new(sink,   &args, sizeof args, NULL);
    Thread_exit(EXIT_SUCCESS);
    return EXIT_SUCCESS;
}