📄 sieve.c
字号:
#include <stdio.h>#include <stdlib.h>#include "assert.h"#include "fmt.h"#include "thread.h"#include "chan.h"struct args { Chan_T c; int n, last;};int source(struct args *p) { int i = 2; if (Chan_send(p->c, &i, sizeof i)) for (i = 3; Chan_send(p->c, &i, sizeof i); ) i += 2; return EXIT_SUCCESS;}void filter(int primes[], Chan_T input, Chan_T output) { int j, x; for (;;) { Chan_receive(input, &x, sizeof x); for (j = 0; primes[j] != 0; j++) if (x%primes[j] == 0) break; if (primes[j] == 0) if (Chan_send(output, &x, sizeof x) == 0) break; } Chan_receive(input, &x, 0);}int sink(struct args *p) { 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; j++) if (x%primes[j] == 0) break; if (primes[j] == 0) { if (x > p->last) break; Fmt_print(" %d", x); assert(i < (int)(sizeof (primes)/sizeof (primes[0]))-2); primes[i++] = x; primes[i] = 0; if (i == p->n) { p->c = Chan_new(); Thread_new((int (*)(void *))sink, p, sizeof *p, NULL); filter(primes, input, p->c); return EXIT_SUCCESS; } } } Fmt_print("\n"); Chan_receive(input, &x, 0); return EXIT_SUCCESS;}int main(int argc, char *argv[]) { struct args args; Thread_init(1, NULL); args.c = Chan_new(); Thread_new((int (*)(void *))source, &args, sizeof args, NULL); args.n = argc > 2 ? atoi(argv[2]) : 5; args.last = argc > 1 ? atoi(argv[1]) : 1000; Thread_new((int (*)(void *))sink, &args, sizeof args, NULL); Thread_exit(EXIT_SUCCESS); return EXIT_SUCCESS;}static char rcsid[] = "$RCSfile: RCS/thread.doc,v $ $Revision: 1.7 $";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -