mirror of
				https://github.com/bytecodealliance/wasm-micro-runtime.git
				synced 2025-10-31 05:11:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			92 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2019 Intel Corporation.  All rights reserved.
 | |
|  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include <pthread.h>
 | |
| #include <semaphore.h>
 | |
| 
 | |
| static pthread_mutex_t mutex;
 | |
| static pthread_cond_t cond;
 | |
| static sem_t *sem;
 | |
| 
 | |
| static void *
 | |
| thread(void *arg)
 | |
| {
 | |
|     int *num = (int *)arg;
 | |
| 
 | |
|     pthread_mutex_lock(&mutex);
 | |
|     printf("thread start \n");
 | |
| 
 | |
|     for (int i = 0; i < 10; i++) {
 | |
|         *num = *num + 1;
 | |
|         printf("num: %d\n", *num);
 | |
|     }
 | |
| 
 | |
|     pthread_cond_signal(&cond);
 | |
|     pthread_mutex_unlock(&mutex);
 | |
|     sem_post(sem);
 | |
| 
 | |
|     printf("thread exit \n");
 | |
| 
 | |
|     return NULL;
 | |
| }
 | |
| 
 | |
| int
 | |
| main(int argc, char *argv[])
 | |
| {
 | |
|     pthread_t tid;
 | |
|     int num = 0, ret = -1;
 | |
| 
 | |
|     if (pthread_mutex_init(&mutex, NULL) != 0) {
 | |
|         printf("Failed to init mutex.\n");
 | |
|         return -1;
 | |
|     }
 | |
|     if (pthread_cond_init(&cond, NULL) != 0) {
 | |
|         printf("Failed to init cond.\n");
 | |
|         goto fail1;
 | |
|     }
 | |
| 
 | |
|     // O_CREAT and S_IRGRPS_IRGRP | S_IWGRP on linux (glibc), initial value is 0
 | |
| 
 | |
|     if (!(sem = sem_open("tessstsem", 0100, 0x10 | 0x20, 0))) {
 | |
|         printf("Failed to open sem. %p\n", sem);
 | |
|         goto fail2;
 | |
|     }
 | |
| 
 | |
|     pthread_mutex_lock(&mutex);
 | |
|     if (pthread_create(&tid, NULL, thread, &num) != 0) {
 | |
|         printf("Failed to create thread.\n");
 | |
|         pthread_mutex_unlock(&mutex);
 | |
|         goto fail3;
 | |
|     }
 | |
| 
 | |
|     printf("cond wait start\n");
 | |
|     pthread_cond_wait(&cond, &mutex);
 | |
|     pthread_mutex_unlock(&mutex);
 | |
|     printf("cond wait success.\n");
 | |
| 
 | |
|     if (sem_wait(sem) != 0) {
 | |
|         printf("Failed to wait sem.\n");
 | |
|     }
 | |
|     else {
 | |
|         printf("sem wait success.\n");
 | |
|     }
 | |
| 
 | |
|     if (pthread_join(tid, NULL) != 0) {
 | |
|         printf("Failed to join thread.\n");
 | |
|     }
 | |
| 
 | |
|     ret = 0;
 | |
| 
 | |
| fail3:
 | |
|     sem_close(sem);
 | |
|     sem_unlink("tessstsem");
 | |
| fail2:
 | |
|     pthread_cond_destroy(&cond);
 | |
| fail1:
 | |
|     pthread_mutex_destroy(&mutex);
 | |
| 
 | |
|     return ret;
 | |
| } | 
