ok I figured something out at least. I should have been using strlen in the Put method. Now it will print, almost in the correct order, but it still deadlocks at some point. Heres the new code:
Code:
#include <pthread.h>
#include <stdio.h>
#include <assert.h>
#include <string.h>
#define QSIZE 10
pthread_cond_t full,/* count == QSIZE */
empty,/* count == 0 */
ready;
pthread_mutex_t m, n; /* implements critical section */
unsigned int iBuf, /* tail of circular queue */
oBuf; /* head of circular queue */
int count; /* count characters */
char buf [QSIZE]; /* the circular queue */
void Put(char s[]) {/* add "ch"; wait if full */
pthread_mutex_lock(&m);
printf("putting %s\n", s);
int i;
for(i = 0; i < strlen(s); i++) {
while (count >= QSIZE)
pthread_cond_wait(&full, &m);/* is there empty slot? */
buf[iBuf] = s[i]; /* store the character */
iBuf = (iBuf+1) % QSIZE; /* increment mod QSIZE */
count++;
if (count == 1)
pthread_cond_signal(&empty);/* new character available */
}
pthread_mutex_unlock(&m);
}
char Get() {/* remove "ch" from queue; wait if empty */
char ch;
pthread_mutex_lock(&m);
while (count <= 0)
pthread_cond_wait(&empty, &m);/* is a character present? */
ch = buf[oBuf]; /* retrieve from the head of the queue */
oBuf = (oBuf+1) % QSIZE;
count--;
if (count == QSIZE-1)
pthread_cond_signal(&full);/* signal existence of a slot */
pthread_mutex_unlock(&m);
return ch;
}
void * p1(void *arg) {
int i;
for (i = 0; i < 5; i++) {
Put("hella");
}
pthread_exit((void *)99);
}
void * p2(void *arg) {
int i;
for (i = 0; i < 5; i++) {
Put("goodby");
}
pthread_exit((void *)21);
}
int main() {
pthread_t t1, t2;
void *r1, *r2;
oBuf = 0; iBuf = 0; count=0; /* all slots are empty */
assert(pthread_cond_init(&full, NULL) == 0);
assert(pthread_cond_init(&empty, NULL) == 0);
assert(pthread_mutex_init(&m, NULL) == 0);
assert(pthread_create(&t1, NULL, p1, &r1) == 0);
assert(pthread_create(&t2, NULL, p2, &r2) == 0);
char c;
int i = 0;
while (i < 55) {
c = Get();
printf("%c\n",c);
i++;
}
assert(pthread_join(t1, &r1) == 0);
assert(pthread_join(t2, &r2) == 0);
pthread_mutex_destroy(&m);
return 0;
}
Something must still be screwy with the mutex or the monitors, please HELP!