1 /*
2 * Copyright (C) 2021 Alibaba Group Holding Limited
3 */
4
5 #include <stdio.h>
6 #include <pthread.h>
7
8 #if AOS_COMP_CLI
9 #include "aos/cli.h"
10 #endif
11
12 static int count = 0;
13 static pthread_mutex_t count_lock = PTHREAD_MUTEX_INITIALIZER;
14 static int ret_value = 0;
15
new_thread_func(void * arg)16 static void *new_thread_func(void *arg)
17 {
18 int increase_count = *((int *)arg);
19
20 printf("new thread:0x%x, arg:%d\n", pthread_self(), increase_count);
21
22 pthread_mutex_lock(&count_lock);
23 printf("new thread hold the lock.\n");
24 count += increase_count;
25 pthread_mutex_unlock(&count_lock);
26
27 ret_value = 100;
28 pthread_exit(&ret_value);
29 }
30
pthread_example(int argc,char ** argv)31 static int pthread_example(int argc, char **argv)
32 {
33 int ret = 0;
34 int increase_count;
35 pthread_t new_thread;
36 pthread_attr_t attr;
37 int *retval;
38
39 pthread_attr_init(&attr);
40 pthread_attr_setstacksize(&attr, 1024);
41 increase_count = 10;
42 ret = pthread_create(&new_thread, &attr, new_thread_func, &increase_count);
43 if (ret != 0) {
44 printf("pthread_create failed, ret:%d\n", ret);
45 pthread_attr_destroy(&attr);
46 return -1;
47 }
48
49 pthread_mutex_lock(&count_lock);
50 printf("Main thread hold the lock.\n");
51 count++;
52 pthread_mutex_unlock(&count_lock);
53
54 ret = pthread_join(new_thread, (void **)&retval);
55 if (ret != 0) {
56 printf("pthread_join return :%d\n", ret);
57 }
58 printf("retval:%p, &ret_value:%p\n", retval, &ret_value);
59 printf("New thread:0x%x exited with vaule: %d\n", new_thread, *retval);
60 printf("The count is %d\n", count);
61 if ((*retval == 100) && (count == 11)) {
62 printf("pthread_example test success!\n");
63 } else {
64 printf("pthread_example test fail!\n");
65 }
66
67 return 0;
68 }
69
70
71 #if AOS_COMP_CLI
72 /* reg args: fun, cmd, description*/
73 ALIOS_CLI_CMD_REGISTER(pthread_example, pthread_example, pthread example)
74 #endif
75
76