xref: /nrf52832-nimble/rt-thread/examples/libc/sem.c (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero #include <pthread.h>
2*10465441SEvalZero #include <semaphore.h>
3*10465441SEvalZero #include <stdio.h>
4*10465441SEvalZero 
5*10465441SEvalZero static sem_t sema;
other_thread()6*10465441SEvalZero static void* other_thread()
7*10465441SEvalZero {
8*10465441SEvalZero 	printf("other_thread here!\n");
9*10465441SEvalZero 
10*10465441SEvalZero 	sleep(1);
11*10465441SEvalZero 
12*10465441SEvalZero 	while (1)
13*10465441SEvalZero 	{
14*10465441SEvalZero 		printf("other_thread: sem_post...\n");
15*10465441SEvalZero 		if(sem_post(&sema) == -1)
16*10465441SEvalZero 			printf("sem_post failed\n");
17*10465441SEvalZero 		sleep(1);
18*10465441SEvalZero 	}
19*10465441SEvalZero 
20*10465441SEvalZero 	printf("other_thread dies!\n");
21*10465441SEvalZero 	pthread_exit(0);
22*10465441SEvalZero }
23*10465441SEvalZero 
test_thread(void * parameter)24*10465441SEvalZero static void test_thread(void* parameter)
25*10465441SEvalZero {
26*10465441SEvalZero 	pthread_t tid;
27*10465441SEvalZero 
28*10465441SEvalZero 	printf("main thread here!\n");
29*10465441SEvalZero 	printf("sleep 5 seconds...");
30*10465441SEvalZero 	sleep(5);
31*10465441SEvalZero 	printf("done\n");
32*10465441SEvalZero 
33*10465441SEvalZero 	sem_init(&sema, 0, 0);
34*10465441SEvalZero 
35*10465441SEvalZero 	/* create the "other" thread */
36*10465441SEvalZero 	if(pthread_create(&tid, 0, &other_thread, 0)!=0)
37*10465441SEvalZero 		/* error */
38*10465441SEvalZero 		printf("pthread_create OtherThread failed.\n");
39*10465441SEvalZero 	else
40*10465441SEvalZero 		printf("created OtherThread=%x\n", tid);
41*10465441SEvalZero 
42*10465441SEvalZero 	/* let the other thread run */
43*10465441SEvalZero 	while (1)
44*10465441SEvalZero 	{
45*10465441SEvalZero 		printf("Main: sem_wait...\n");
46*10465441SEvalZero 		if(sem_wait(&sema) == -1)
47*10465441SEvalZero 			printf("sem_wait failed\n");
48*10465441SEvalZero 		printf("Main back.\n\n");
49*10465441SEvalZero 	}
50*10465441SEvalZero 
51*10465441SEvalZero 	pthread_exit(0);
52*10465441SEvalZero }
53*10465441SEvalZero #include <finsh.h>
libc_sem()54*10465441SEvalZero void libc_sem()
55*10465441SEvalZero {
56*10465441SEvalZero 	rt_thread_t tid;
57*10465441SEvalZero 
58*10465441SEvalZero 	tid = rt_thread_create("semtest", test_thread, RT_NULL,
59*10465441SEvalZero 		2048, 20, 5);
60*10465441SEvalZero 	if (tid != RT_NULL)
61*10465441SEvalZero 	{
62*10465441SEvalZero 		rt_thread_startup(tid);
63*10465441SEvalZero 	}
64*10465441SEvalZero }
65*10465441SEvalZero FINSH_FUNCTION_EXPORT(libc_sem, posix semaphore test);
66