Hi All! I was wrting a small test program using semaphores and pthreads. The program compiles fine with 'g++ -lpthread -o a8 a8.cpp'
But when I run it, I get: segmentation fault. If I comment out the second pthread_join() and compile and run it, then I get the output on the screen and no segmentation fault. If I run it in gdb, I get: (gdb) run Starting program: a8 [Thread debugging using libthread_db enabled] [New Thread 0x7fda52cbd6f0 (LWP 14657)] [New Thread 0x41357950 (LWP 14660)] Entered producer thread [New Thread 0x41b58950 (LWP 14661)] Entered consumer thread [Thread 0x41b58950 (LWP 14661) exited] [Thread 0x41357950 (LWP 14660) exited] Program received signal SIGSEGV, Segmentation fault. [Switching to Thread 0x7fda52cbd6f0 (LWP 14657)] 0x00007fda528a8628 in pthread_join () from /lib/libpthread.so.0 (gdb) The program is listed below. Can anyone tell me if I am doing something wrong. All this is done on Debian Lenny amd64 port. #include <pthread.h> #include <semaphore.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> class mailbox { public: mailbox(); //constructor int request(); //return next int from mailbox or block void release(int x); //add x to mailbox or block private: sem_t num_empty; sem_t num_full; int *data; int producer_ptr; int consumer_ptr; }; mailbox::mailbox() { sem_init(&num_empty, 0, 10); sem_init(&num_full, 0, 0); data = (int *)malloc(10); producer_ptr = 0; consumer_ptr = 0; } int mailbox::request() { sem_wait(&num_full); int temp = data[consumer_ptr]; sem_post(&num_empty); consumer_ptr = (consumer_ptr + 1) % 10; return temp; } void mailbox::release(int x) { sem_wait(&num_empty); data[producer_ptr] = x; sem_post(&num_full); producer_ptr = (producer_ptr + 1) % 10; } mailbox m; //declares m to be a mailbox of integers of size 10 void *producer(void *arg) { printf("Entered producer thread\n"); int j; for (j = 0; j < 105; j++) m.release(j); pthread_exit(NULL); } void *consumer(void *arg) { printf("Entered consumer thread\n"); int j; for (j = 0; j < 100; j++) printf(" %d ", m.request()); pthread_exit(NULL); } int main() { pthread_t TId1, TId2; pthread_create(&TId1, NULL, producer, NULL); pthread_create(&TId1, NULL, consumer, NULL); pthread_join(TId1, NULL); pthread_join(TId2, NULL); printf("\n\n\n"); return 0; } -- Sincerely yours, Alexandru Cardaniuc -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]