some pthread test progs
[tridge/junkcode.git] / pthreads / yield.c
1 #include <stdio.h>
2 #include <unistd.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <sys/wait.h>
6 #include <errno.h>
7 #include <pthread.h>
8
9
10 /*
11   create a thread with initial function fn(private)
12 */
13 static int thread_start(void *(*fn)(void *private), void *private)
14 {
15         pthread_t thread_id;
16         pthread_attr_t thread_attr;
17         int rc;
18
19         pthread_attr_init(&thread_attr);
20         pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
21         rc = pthread_create(&thread_id, &thread_attr, fn, private);
22         pthread_attr_destroy(&thread_attr);
23         return rc;
24 }
25
26 static int xx;
27 const int nthreads = 2;
28
29 /*
30   main thread fn
31 */
32 static void *thread_main(void *private)
33 {
34         int n = (int)private;
35
36         while (1) {
37                 if (xx % nthreads == n) {
38                         n++;
39                 }
40                 pthread_yield();
41         }
42
43         return NULL;
44 }
45
46 /* lock a byte range in a open file */
47 int main(int argc, char *argv[])
48 {
49         int i;
50
51         for (i=0;i<nthreads;i++) {
52                 thread_start(thread_main, i);
53         }
54         sleep(10);
55         return 0;
56 }