Semaphores working
This commit is contained in:
		
							parent
							
								
									6a93bb426d
								
							
						
					
					
						commit
						c750088696
					
				
							
								
								
									
										56
									
								
								Semaphore.c
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								Semaphore.c
									
									
									
									
									
								
							| @ -1,12 +1,19 @@ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <pthread.h> | ||||
| 
 | ||||
| #define SEM_LIMIT 100 | ||||
| 
 | ||||
| typedef struct sem_t | ||||
| { | ||||
|     ; | ||||
|     pthread_mutex_t mutex; | ||||
|     pthread_cond_t condition; | ||||
|     int count; | ||||
| } sem_t; | ||||
| 
 | ||||
| void* ThreadOne(void* voidPass); | ||||
| void* ThreadTwo(void* voidPass); | ||||
| void* ThreadA(void* voidPass); | ||||
| void* ThreadB(void* voidPass); | ||||
| void sem_init(sem_t* semaphore, int pshared, unsigned int value); | ||||
| void sem_post(sem_t* semaphore); | ||||
| void sem_wait(sem_t* semaphore); | ||||
| 
 | ||||
| @ -15,11 +22,18 @@ sem_t aArrived, bArrived; | ||||
| 
 | ||||
| int main(void) | ||||
| { | ||||
|     pthread_t thread1, thread2; | ||||
|     sem_init(&aArrived, 0, 1); | ||||
|     sem_init(&bArrived, 0, 1); | ||||
|     pthread_create(&thread1, NULL, ThreadA, NULL); | ||||
|     pthread_create(&thread2, NULL, ThreadB, NULL); | ||||
|     pthread_join(thread1, NULL); | ||||
|     pthread_join(thread2, NULL); | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| //  Thread A for testing multithread
 | ||||
| void* ThreadOne(void* voidPass) | ||||
| void* ThreadA(void* voidPass) | ||||
| { | ||||
|     printf("a1\n"); | ||||
|     sem_post(&aArrived); | ||||
| @ -28,10 +42,42 @@ void* ThreadOne(void* voidPass) | ||||
| } | ||||
| 
 | ||||
| //  Thread B for testing multithread
 | ||||
| void* ThreadTwo(void* voidPass) | ||||
| void* ThreadB(void* voidPass) | ||||
| { | ||||
|     printf("b1\n"); | ||||
|     sem_post(&bArrived); | ||||
|     sem_wait(&aArrived); | ||||
|     printf("b2\n"); | ||||
| } | ||||
| 
 | ||||
| //  Dummy function for recreation purposes
 | ||||
| void sem_init(sem_t* semaphore, int pshared, unsigned int value) | ||||
| { | ||||
|     /* Faked pshared to keep with original */ | ||||
|     /* Faked value to keep with original */ | ||||
|     pthread_cond_init(&semaphore->condition, NULL); | ||||
|     pthread_mutex_init(&semaphore->mutex, NULL); | ||||
|     semaphore->count = 0; | ||||
| } | ||||
| 
 | ||||
| //  Unlocks a thread to be run
 | ||||
| void sem_post(sem_t* semaphore) | ||||
| { | ||||
|     semaphore->count++; | ||||
|     if (semaphore->count <= 0) | ||||
|     { | ||||
|         pthread_mutex_unlock(&semaphore->mutex); | ||||
|         pthread_cond_signal(&semaphore->condition); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| //  Locks a thread
 | ||||
| void sem_wait(sem_t* semaphore) | ||||
| { | ||||
|     semaphore->count--; | ||||
|     if (semaphore->count < 0) | ||||
|     { | ||||
|         pthread_mutex_lock(&semaphore->mutex); | ||||
|         pthread_cond_wait(&semaphore->condition, &semaphore->mutex); | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user