Hello there,
greetings from Germany. ;)
I'm currently trying to work myself into AMQ. I already tried several
approches to the producer thread question and have searched the web and the
forum. I'm also a beginner to the multithreading theme.
The situation:
I would like my application to create a consumer and a producer, which is no
problem. But both should live forever.
The consumer sleeps via a Countdownlatch, which will never be count down,
and wakes up via a Messagelistener, when a message is recieved.
The producer is my main problem. The application tells me to send a message.
Now i want to tell my producer thread to send this message syncron with
failure handling etc, while my application runs on. How do i tell the thread
to wait for a message? How do I tell the threads to live forever?
I already thought about using mutexes, semaphores, signals etc. But i found
out that the decaf threads already use pthread internally. So i guess there
exists functions for my problems, that i haven't found so far.
Propably my first trys do something which is way to complex, where there
already exists methods or wrapper:
I already tried to use signals, but the signal doesn't seems work with the
threadID i get from the decaf thread. Eg:
Application:
this->consumerThread = new Thread(&cmsConsAsync);
this->consumerThread->start();
cmsConsAsync.waitUntilReady();
this->producerThread = new Thread(&cmsProdAsync);
this->producerThread->start();
cmsProdAsync.waitUntilReady();
this->prodThreadID = this->producerThread->getId();
printf("PID: %lld\n", this->prodThreadID);
printf("State: %d\n", this->producerThread->getState());
if (this->producerThread->isAlive())
{
printf("IsAlive\n");
kill(this->prodThreadID, SIGUSR1);
printf("IsAlive2\n");
}
else
printf("I'm killed!\n");
The Producer:
/* set function calls */
signal(SIGUSR1, CMSProducer::sendTextMessage);
signal(SIGUSR2, CMSProducer::sendObjMessage);
signal(SIGQUIT, CMSProducer::shutdown);
//let caller run on
latch.countDown();
//set to sleep, will wake up on signal calls
//waitLatch.await();
while(CMSProducer::noQuit)
{
printf("PAUSE!\n");
pause();
}
Is there a better way to do something like this?
Best regards,
amqBeginner