Thread: Circular character buffer with pthreads/mutex/cond deadlock help!

Threaded View

Previous Post Previous Post   Next Post Next Post
  1. #1
    Registered User
    Join Date
    May 2011
    Posts
    11

    Circular character buffer with pthreads/mutex/cond deadlock help!

    I am implementing a circular character buffer for an assignment, the requirements are pretty strict so I can't change the logic from what it is now too much. Unfortunately, this code deadlocks right out of the gate. I'm new to pthreads and concurrent programming in general so I could use some help spotting the error here.

    Code:
    #include <pthread.h>
    #include <stdio.h>
    
    #define QSIZE 10
    
    pthread_cond_t full,/* count == QSIZE */ 
    	       empty;/* count == 0 */ 
    pthread_mutex_t m; /* 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 */
    	int size = sizeof(s)/sizeof(char);
    	printf("size: %d", size); //doesn't print
    	pthread_mutex_lock(&m); 
    	int i;
    	for(i = 0; i < size; 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"); 
    	}
    }
    
    void * p2(void *arg) {
    	int i;
    	for (i = 0; i < 5; i++) {
    		Put("goodby"); 
    	}
    }
    
    int main() { 
    	pthread_t t1, t2;
    	void *r1, *r2;
    	oBuf = 0; iBuf = 0; count=0; /* all slots are empty */ 
    
    	pthread_cond_init(&full, NULL); 
    	pthread_cond_init(&empty, NULL); 
    	pthread_mutex_init(&m, NULL); 
    	
    	pthread_create(&t1, NULL, p1, &r1);
    	pthread_create(&t2, NULL, p2, &r2);
    	
    	printf("Main"); //doesn't print
    	char c;
    	int i = 0;
    	while (i < 55) {
    		c = Get();
    		printf("%c",c);
    		i++;
    	}
    
    	pthread_join(t1, &r1);
    	pthread_join(t2, &r2);
    	return 0; 
    }
    EDIT: I think i need to modify the reentry queue somehow, but I know nothing of how to do it.
    Last edited by wassat676; 06-26-2011 at 05:04 PM.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Replies: 3
    Last Post: 11-11-2010, 12:05 PM
  2. Mutex, Cond and Thread questions (pthread, linux)
    By thebearot in forum C Programming
    Replies: 14
    Last Post: 04-23-2010, 12:10 PM
  3. scanf issue - character in buffer
    By demps in forum C Programming
    Replies: 2
    Last Post: 01-19-2010, 07:51 PM
  4. Circular buffer - logic difficulty
    By erasm in forum C Programming
    Replies: 2
    Last Post: 10-05-2009, 01:08 PM
  5. Circular Buffer
    By parisframe in forum C Programming
    Replies: 11
    Last Post: 09-16-2009, 11:05 PM

Tags for this Thread