1180
|
1 #include "Sem.h"
|
|
2 #include <pthread.h>
|
|
3
|
|
4
|
|
5 Sem::Sem(int value)
|
|
6 {
|
|
7 sem = new sem_t;
|
|
8 pthread_mutex_init(&sem->mutex, NULL);
|
|
9 pthread_cond_init(&sem->cond, NULL);
|
|
10 sem->value = value;
|
|
11 }
|
|
12
|
|
13 Sem::~Sem()
|
|
14 {
|
|
15 pthread_mutex_destroy(&sem->mutex);
|
|
16 pthread_cond_destroy(&sem->cond);
|
|
17
|
|
18 delete sem;
|
|
19 }
|
|
20
|
|
21 //P命令
|
|
22 //資源を確保する
|
|
23 void
|
|
24 Sem::sem_p()
|
|
25 {
|
|
26 pthread_mutex_lock(&sem->mutex);
|
|
27 //セマフォ変数が0の時、他のスレッドが資源を解放するのを待つ
|
|
28 while(sem->value == 0) {
|
|
29 pthread_cond_wait(&sem->cond, &sem->mutex);
|
|
30 }
|
1186
|
31 //atomic
|
|
32 //sem->value--; //資源の確保
|
1187
|
33 //count()のvalueを取得する際にアトミック操作が必要
|
1186
|
34 __sync_fetch_and_sub(&sem->value,1);
|
1180
|
35 pthread_mutex_unlock(&sem->mutex);
|
|
36 }
|
|
37
|
|
38 //V命令
|
|
39 //資源を解放する
|
|
40 void
|
|
41 Sem::sem_v()
|
|
42 {
|
|
43 pthread_mutex_lock(&sem->mutex);
|
1186
|
44 //atomic
|
|
45 //sem->value++; //資源の解放
|
|
46 __sync_fetch_and_add(&sem->value,1);
|
1180
|
47
|
|
48 //資源の解放を知らせる
|
|
49 pthread_cond_signal(&sem->cond);
|
1186
|
50 pthread_mutex_unlock(&sem->mutex);
|
|
51
|
1180
|
52 }
|
1186
|
53
|
|
54 int
|
|
55 Sem::count()
|
|
56 {
|
|
57 //semの値を返せばよい。
|
|
58 //atomic
|
|
59 return sem->value;
|
|
60 }
|