Code:
// Homework 8
// Threaded Primes
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <math.h>
#include <semaphore.h>
#include <fcntl.h>
#define Q_SIZE 10
struct queue {
int queue[Q_SIZE];
int front; int back;
sem_t *mutex;
sem_t *slots;
sem_t *items;
};
struct filter {
struct queue *input;
struct queue *output;
int p;
};
void *numberFilter(void *filterStruct) { // check #s
struct filter *temp = (struct filter *)filterStruct;
int number = temp->p;
struct queue *inputQ = temp->input;
struct queue *outputQ = temp->output;
printf(" %d",88);
while(1) {
int nextNumber = dequeue(inputQ);
printf(" %d ", nextNumber);
if(nextNumber == -1) {
enqueue(number, outputQ);
return; // stop executing. poison pill received.
}
if(nextNumber == number) enqueue(number, outputQ);
if(nextNumber%number != 0) enqueue(nextNumber, outputQ);
}
}
void *generator(struct queue *q) { // generate #'s 2 thru 1000
struct queue *queue1 = q;
int counter = 2;
while(counter<1001) {
enqueue(counter, queue1);
counter++;
}
enqueue(-1, queue1); // send poison pill
}
void *finalCheck(void *inputQ) { // final checker, 13 thru sqrt of #
struct queue *temp = (struct queue *)inputQ;
int nextNumber;
while(1) {
nextNumber = dequeue(temp);
if(nextNumber == -1) {
return; // stop executing. poison pill received.
}
int prime = 1; int i;
for(i = 13; i<=sqrt(nextNumber); i+=2) {
if(nextNumber%i == 0) prime = 0;
}
if(prime == 1) printf("%d ", nextNumber);
}
}
void *initQueue(struct queue *q) {
q->queue[0] = 0;
q->front = 0; q->back = 0;
q->mutex = sem_open("QueueMutex", O_CREAT, 0700, 1); // init mutex sem
if (!q->mutex) {
perror("semaphore create error");
exit(4);
}
q->slots = sem_open("QueueSlots", O_CREAT, 0700, 10); // init slots sem
if (!q->slots) {
perror("semaphore create error");
exit(4);
}
q->items = sem_open("QueueItems", O_CREAT, 0700, 0); // init items sem
if (!q->items) {
perror("semaphore create error");
exit(4);
}
sem_unlink("QueueMutex");
sem_unlink("QueueSlots");
sem_unlink("QueueItems");
}
void enqueue(int newElement, struct queue *q) {
sem_wait(q->slots); // P(slots) operation.
sem_wait(q->mutex); // P(mutex) operation.
q->queue[q->back] = newElement;
q->back = (q->back+1) % Q_SIZE;
sem_post(q->mutex); // V(mutex) operation.
sem_post(q->items); // V(items) operation.
}
int dequeue(struct queue *q) {
sem_wait(q->items); // P(items) operation.
sem_wait(q->mutex); // P(mutex) operation.
int value = q->queue[q->front];
q->front = (q->front+1) % Q_SIZE;
sem_post(q->mutex); // V(mutex) operation.
sem_post(q->slots); // V(slots) operation.
return value;
}
int main() {
printf("anything???");
struct queue *queue1, *queue2, *queue3, *queue4, *queue5, *queue6;
printf("justbeforemalloc");
queue1 = (struct queue *) malloc(sizeof(struct queue));
printf("we did one");
queue2 = (struct queue *) malloc(sizeof(struct queue));
queue3 = (struct queue *) malloc(sizeof(struct queue));
queue4 = (struct queue *) malloc(sizeof(struct queue));
queue5 = (struct queue *) malloc(sizeof(struct queue));
queue6 = (struct queue *) malloc(sizeof(struct queue));
printf("We got to here.");
initQueue(queue1);
initQueue(queue2);
initQueue(queue3);
initQueue(queue4);
initQueue(queue5);
initQueue(queue6);
struct filter filter2 = {queue1, queue2, 2};
struct filter filter3 = {queue2, queue3, 3};
struct filter filter5 = {queue3, queue4, 5};
struct filter filter7 = {queue4, queue5, 7};
struct filter filter11 = {queue5, queue6, 11};
generator(queue1);
pthread_t thread2;
pthread_create(&thread2, NULL, numberFilter, &filter2);
printf("Checkpoint");
// creates thread for sorting through 2's.
pthread_t thread3;
pthread_create(&thread3, NULL, numberFilter, &filter3);
printf("Checkpoint2");
// creates thread for sorting through 3's.
pthread_t thread5;
pthread_create(&thread5, NULL, numberFilter, &filter5);
printf("Checkpoint3");
// creates thread for sorting through 5's.
pthread_t thread7;
pthread_create(&thread7, NULL, numberFilter, &filter7);
printf("Checkpoint4");
// creates thread for sorting through 7's.
pthread_t thread11;
pthread_create(&thread11, NULL, numberFilter, &filter11);
printf("Checkpoint5");
// creates thread for sorting through 11's.
pthread_t threadFinal;
pthread_create(&threadFinal, NULL, finalCheck, &queue6);
printf("Done");
// creates thread for final check.
free(queue1);
free(queue2);
free(queue3);
free(queue4);
free(queue5);
free(queue6);
}