-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpc
More file actions
111 lines (99 loc) · 2.48 KB
/
pc
File metadata and controls
111 lines (99 loc) · 2.48 KB
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>
#include <unistd.h>
#define MAX_SIZE 10
// Circular buffer structure
typedef struct {
int buffer[MAX_SIZE];
int head;
int tail;
int size;
omp_lock_t lock;
} CircularBuffer;
// Initialize the circular buffer
void initBuffer(CircularBuffer* cb) {
cb->head = 0;
cb->tail = 0;
cb->size = 0;
omp_init_lock(&cb->lock);
}
// Destroy the circular buffer
void destroyBuffer(CircularBuffer* cb) {
omp_destroy_lock(&cb->lock);
}
// Add an item to the buffer
void addItem(CircularBuffer* cb, int item) {
while (1) {
omp_set_lock(&cb->lock);
if (cb->size < MAX_SIZE) {
cb->buffer[cb->tail] = item;
cb->tail = (cb->tail + 1) % MAX_SIZE;
cb->size++;
omp_unset_lock(&cb->lock);
return;
}
omp_unset_lock(&cb->lock);
usleep(100); // Sleep for 100 microseconds
}
}
// Remove an item from the buffer
int removeItem(CircularBuffer* cb) {
while (1) {
omp_set_lock(&cb->lock);
if (cb->size > 0) {
int item = cb->buffer[cb->head];
cb->head = (cb->head + 1) % MAX_SIZE;
cb->size--;
omp_unset_lock(&cb->lock);
return item;
}
omp_unset_lock(&cb->lock);
usleep(100); // Sleep for 100 microseconds
}
}
// Producer function
void producer(CircularBuffer* cb, int id, int numItems) {
for (int i = 0; i < numItems; i++) {
int item = id * 1000 + i;
addItem(cb, item);
printf("Producer %d produced item %d\n", id, item);
usleep(100); // Sleep for 100 microseconds
}
}
// Consumer function
void consumer(CircularBuffer* cb, int id, int numItems) {
for (int i = 0; i < numItems; i++) {
int item = removeItem(cb);
printf("Consumer %d consumed item %d\n", id, item);
usleep(150); // Sleep for 150 microseconds
}
}
int main() {
CircularBuffer cb;
initBuffer(&cb);
int numProducers = 2;
int numConsumers = 2;
int numItems = 5;
#pragma omp parallel sections
{
#pragma omp section
{
producer(&cb, 1, numItems);
}
#pragma omp section
{
producer(&cb, 2, numItems);
}
#pragma omp section
{
consumer(&cb, 1, numItems);
}
#pragma omp section
{
consumer(&cb, 2, numItems);
}
}
destroyBuffer(&cb);
return 0;
}