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 <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
#define SEM_LIMIT 100
|
||||||
|
|
||||||
typedef struct sem_t
|
typedef struct sem_t
|
||||||
{
|
{
|
||||||
;
|
pthread_mutex_t mutex;
|
||||||
|
pthread_cond_t condition;
|
||||||
|
int count;
|
||||||
} sem_t;
|
} sem_t;
|
||||||
|
|
||||||
void* ThreadOne(void* voidPass);
|
void* ThreadA(void* voidPass);
|
||||||
void* ThreadTwo(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_post(sem_t* semaphore);
|
||||||
void sem_wait(sem_t* semaphore);
|
void sem_wait(sem_t* semaphore);
|
||||||
|
|
||||||
@ -15,11 +22,18 @@ sem_t aArrived, bArrived;
|
|||||||
|
|
||||||
int main(void)
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Thread A for testing multithread
|
// Thread A for testing multithread
|
||||||
void* ThreadOne(void* voidPass)
|
void* ThreadA(void* voidPass)
|
||||||
{
|
{
|
||||||
printf("a1\n");
|
printf("a1\n");
|
||||||
sem_post(&aArrived);
|
sem_post(&aArrived);
|
||||||
@ -28,10 +42,42 @@ void* ThreadOne(void* voidPass)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Thread B for testing multithread
|
// Thread B for testing multithread
|
||||||
void* ThreadTwo(void* voidPass)
|
void* ThreadB(void* voidPass)
|
||||||
{
|
{
|
||||||
printf("b1\n");
|
printf("b1\n");
|
||||||
sem_post(&bArrived);
|
sem_post(&bArrived);
|
||||||
sem_wait(&aArrived);
|
sem_wait(&aArrived);
|
||||||
printf("b2\n");
|
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