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