OS1/threads/main.c

114 lines
1.8 KiB
C
Raw Normal View History

2023-11-29 12:33:45 -08:00
#include "main.h"
#define SIZE 1
pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t myCond1, myCond2;
int myCount;
int isProduced = 0;
int main() {
printf("PROGRAM START\n");
fflush(stdout);
// Create the consumer thread
pthread_t consumerID;
int resultInt = pthread_create(&consumerID, NULL, consumer, NULL);
producer();
}
void producer() {
while (1) {
pthread_mutex_lock(&myMutex);
print_mutex("PRODUCER", "locked");
while (isProduced == SIZE) {
print_wait("PRODUCER", "myCond2");
pthread_cond_wait(&myCond2, &myMutex);
}
if(myCount == 10)
end_program();
myCount++;
isProduced++;
pthread_mutex_unlock(&myMutex);
print_mutex("PRODUCER", "unlocked");
pthread_cond_signal(&myCond1);
print_signal("PRODUCER", "myCond1");
}
}
void* consumer() {
printf("CONSUMER THREAD CREATED\n");
fflush(stdout);
while (1) {
pthread_mutex_lock(&myMutex);
print_mutex("CONSUMER", "locked");
while (isProduced == 0) {
print_wait("CONSUMER", "myCond1");
pthread_cond_wait(&myCond1, &myMutex);
}
print_count();
isProduced--;
pthread_mutex_unlock(&myMutex);
print_mutex("CONSUMER", "unlocked");
pthread_cond_signal(&myCond2);
print_signal("CONSUMER", "myCond1");
}
}
void end_program() {
printf("PROGRAM END\n");
fflush(stdout);
exit(0);
}
void print_mutex(char* type, char* lockstate) {
printf("%s: myMutex %s\n", type, lockstate);
fflush(stdout);
}
void print_count() {
printf("myCount: %d -> %d\n", myCount-1, myCount);
fflush(stdout);
}
void print_wait(char* type, char* var) {
printf("%s: waiting on %s\n", type, var);
fflush(stdout);
}
void print_signal(char* type, char* var) {
printf("%s: signaling %s\n", type, var);
fflush(stdout);
}