-
Notifications
You must be signed in to change notification settings - Fork 0
/
semaphore.c
44 lines (38 loc) · 1.06 KB
/
semaphore.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//
// Created by Raphaël Dantzer on 16/07/16.
//
#include <assert.h>
#include "thread_pool.h"
void semaphore_init(t_semaphore *semaphore, int value)
{
assert(value == 0 || value == 1);
pthread_mutex_init(&(semaphore->mutex), NULL);
pthread_cond_init(&(semaphore->cond), NULL);
semaphore->v = value;
}
void semaphore_reset(t_semaphore *semaphore)
{
semaphore_init(semaphore, 0);
}
void semaphore_post(t_semaphore *semaphore)
{
pthread_mutex_lock(&semaphore->mutex);
semaphore->v = 1;
pthread_cond_signal(&semaphore->cond);
pthread_mutex_unlock(&semaphore->mutex);
}
void semaphore_post_all(t_semaphore *semaphore)
{
pthread_mutex_lock(&semaphore->mutex);
semaphore->v = 1;
pthread_cond_broadcast(&semaphore->cond);
pthread_mutex_unlock(&semaphore->mutex);
}
void semaphore_wait(t_semaphore *semaphore)
{
pthread_mutex_lock(&semaphore->mutex);
while (semaphore->v != 1)
pthread_cond_wait(&semaphore->cond, &semaphore->mutex);
semaphore->v = 0;
pthread_mutex_unlock(&semaphore->mutex);
}