-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcond_test.c
More file actions
73 lines (61 loc) · 1.88 KB
/
cond_test.c
File metadata and controls
73 lines (61 loc) · 1.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
* ================================
* eli960@qq.com
* http://linuxmail.cn/
* 2017-07-02
* ================================
*/
#include "coroutine.h"
#include <stdio.h>
#include <unistd.h>
zcoroutine_cond_t *cond;
zcoroutine_mutex_t *mutex;
static void *wait_cond_then_do_something(void *context)
{
for (int i = 0; i < 2; i++) {
/* zcoroutine_mutex_lock(mutex); */
zcoroutine_cond_wait(cond, mutex);
printf("get signal, id=%d, loop=%d\n", (int)(long)context, i+1);
/* zcoroutine_mutex_unlock(mutex); */
}
/* should execute unlock, here */
/* auto release all mutexs when a coroutine exit */
return context;
}
static void *begin_my_test(void *context)
{
cond = zcoroutine_cond_create();
mutex = zcoroutine_mutex_create();
printf("start 10 coroutine to wait cond.\n");
for (int i = 0; i < 10; i++) {
zcoroutine_go(wait_cond_then_do_something, (void *)(long)i, 0);
}
printf("waiting 1 second ...\n");
printf("\n\ncoroutine_cond_signal, then sleep 1s ... \n");
zcoroutine_cond_signal(cond);
sleep(1);
printf("\n\ncoroutine_cond_broadcast ... \n");
zcoroutine_cond_broadcast(cond);
printf("\n\ncoroutine_cond_broadcast, then sleep 1s ... \n");
zcoroutine_cond_broadcast(cond);
sleep(1);
printf("\n\ncoroutine_cond_broadcast ... \n");
zcoroutine_cond_broadcast(cond);
printf("\n\ncoroutine_cond_free, coroutine_mutex_free then sleep 1s ... \n");
zcoroutine_cond_free(cond);
zcoroutine_mutex_free(mutex);
sleep(1);
printf("\n\nnotify stop ... \n");
zcoroutine_base_stop_notify(0);
return 0;
}
int main(int argc, char **argv)
{
zcoroutine_base_init();
zcoroutine_go(begin_my_test, 0, 0);
zcoroutine_base_run();
printf("\n\nzcoroutine_base_run over, then zcoroutine_base_fini \n");
zcoroutine_base_fini();
printf("\n");
return 0;
}