This is the mail archive of the
pthreads-win32@sources.redhat.com
mailing list for the pthreas-win32 project.
Re: Threading Issue - Program hangs on Ctrl-C - URGENT PLZ
- From: amit mishra <infoworldindia at yahoo dot com>
- To: jasvinder bajwa <jasvinder_bajwa9 at hotmail dot com>, pthreads-win32 at sources dot redhat dot com
- Date: Sun, 19 Oct 2003 21:59:53 -0700 (PDT)
- Subject: Re: Threading Issue - Program hangs on Ctrl-C - URGENT PLZ
Hi,
Thanks Jasvinder for reply & suggestion.
After changing the optimization to "default" in MSVC++
project settings (Release Mode), the issue of computer
getting hanged has been resolved.
This is a KNOWN BUG :~ "Cancellation problems in
optimised code"
http://sources.redhat.com/pthreads-win32/bugs.html
"I think the message of this section is that usage of
VCE version of pthreads in applications relying on
cancellation/cleanup AND using optimisations for
creation of production code is highly unreliable for
the current version of the pthreads library."
Does it mean, I should use Win32 threads API rather
than pthread-win32 when optimization is highly
required ???
Regards,
Amit
--- jasvinder bajwa <jasvinder_bajwa9@hotmail.com>
wrote:
>
> Hi Amit,
> In all your thread functions , you have statement do
> { } while(true) and
> trying to read from comm ports.
> I guess you are looking for a graceful way of
> shutting down the threads.
> i will suggest you to set a global variable
> something like timeToExit = 1;
> change the condition to run the thread for ever to
> do { } while(timeToExit)
> and when your applicaion catches Ctrl+C or any
> unwanted signal set the
> timeToExit to 0 which will cause all the threads to
> exit.
>
> I guess it may solve the issue.
> Thanks
> Jas
>
>
>
> >From: amit mishra <infoworldindia@yahoo.com>
> >To: pthread <pthreads-win32@sources.redhat.com>
> >Subject: Re: Threading Issue - Program hangs on
> Ctrl-C - URGENT PLZ
> >Date: Fri, 17 Oct 2003 23:14:08 -0700 (PDT)
> >
> >Hi Ross,
> >
> >Thanks for the reply.
> >I suppose the threads are not able to exit
> properly.
> >Since all the threads are never going to terminate
> as
> >it continues to read from respective COM ports,
> there
> >should be some mechanism to end the thread
> gracefully.
> >
> >Could anyone give me sample code to test with for
> >handling signals like Ctrl-C or to gracefully end
> the
> >pthreads.
> >
> >Also, what should be the ideal mechanism for ending
> >the threads when threads are continuosly running
> (i.e.
> >its not going to terminate until some signal like
> >Ctrl-C is given) ??
> >
> >Many Thanks
> >Amit
> >
> >
> >
> >
> >
> >--- Ross Johnson <rpj@callisto.canberra.edu.au>
> wrote:
> > > I don't have any direct experience in this area
> but
> > > I believe exception
> > > management in MT applications is tricky, so I
> > > apologise in advance for
> > > responding with questions.
> > >
> > > Questions:
> > > What happens to the other threads when one
> thread
> > > catches the exception
> > > generated by ctrl-C?
> > > What if the exception arrives while the thread
> holds
> > > the mutex?
> > >
> > > Ross
> > >
> > > amit mishra wrote:
> > >
> > > >Hi,
> > > >I had a simple serial port communication
> > > application
> > > >which uses pthread-win32 for threading.
> > > >
> > > >When the program exits, the application hangs
> and
> > > the
> > > >only way to recover is to restart the machine.
> > > >
> > > >I have debugged and the issue seems to be
> regarding
> > > >thread handling or signal handling.
> > > >
> > > >Code snippet is given below for reference. Feel
> > > free
> > > >to ask for more information.
> > > >
> > > >Please reply asap.
> > > >Many Thanks
> > > >Amit
> > > >--- CODE STARTS ------------------------------
> > > >// all header files not shown
> > > >
> > > >#include "pthread.h"
> > > >#include "signal.h"
> > > >
> > > >// three threads for each ports
> > > >pthread_t t[3];
> > > >int result = 0;
> > > >int tid1, tid2, tid3;
> > > >
> > > >void* portOneFunc(void* arg);
> > > >void* portTwoFunc(void* arg);
> > > >void* portThreeFunc(void* arg);
> > > >
> > > >CDataOne* data1 = NULL;
> > > >CDataTwo* data2 = NULL;
> > > >CDataThree* data3 = NULL;
> > > >
> > > >// Custom Mutex class using pthread mutex
> > > >CMyMutex myMutex;
> > > >CWinApp theApp;
> > > >
> > > >//////////////////////////////////////////
> > > >// Main
> > > >//////////////////////////////////////////
> > > >
> > > >int _tmain(int argc, TCHAR* argv[], TCHAR*
> envp[])
> > > >{
> > > >// ---Initialize COMM Ports---
> > > >CCommPort p1(RS_COM1); // COM1
> > > >CCommPort p2(RS_COM2); // COM2
> > > >CCommPort p3(RS_COM3); // COM3
> > > >
> > > >// Init various Data Analyzers
> > > >data1 = new CDataOne();
> > > >data2 = new CDataTwo();
> > > >data3 = new CDataThree();
> > > >
> > > >try {
> > > > // --------- Create Threads ------------
> > > > // Pthread Create
> > > > tid1 = pthread_create(
> > > > &t[0], NULL, portOneFunc, &p1);
> > > > tid2 = pthread_create(
> > > > &t[1], NULL, portTwoFunc, &p2);
> > > > tid3 = pthread_create(
> > > > &t[2], NULL, portThreeFunc, &p3);
> > > >
> > > > // -------- Wait for Threads to complete ----
> > > > // Pthread Join
> > > > int ret = 0;
> > > >
> > > > if (pthread_join(t[0], (void **) &result)) {
> > > > cout << "pthread join error" << endl;
> > > >
> > > > }
> > > > if (pthread_join(t[1], (void **) &result)) {
> > > > cout << "pthread join error" << endl;
> > > > }
> > > > if (pthread_join(t[2], (void **) &result)) {
> > > > cout << "pthread join error" << endl;
> > > > }
> > > >
> > > >} PtW32CatchAll {
> > > > cerr << "ERROR : Thread Error" << endl;
> > > >}
> > > >
> > > >delete data1;
> > > >delete data2;
> > > >delete data3;
> > > >
> > > >return 0;
> > > >}
> > > >
> > > >
> > > >//////////////////////////////////////////
> > > >// Thread Functions
> > > >//////////////////////////////////////////
> > > >
> > > >void* PortOneFunc(void* arg) {
> > > >
> > > >CCommPort *x_oPort1 = (CCommPort*)arg;
> > > >
> > > >try {
> > > > // Open Port with baudrate 4800
> > > > if (x_oPort1->Open(RS_4800)) {
> > > > cout << "COM1 Opened" << endl;
> > > > do {
> > > > // Get till terminating chars
> > > > string str = x_oPort1->GetLine().c_str();
> > > >myMutex.lock(); // Append the data for
> further
> > > >analysis
> > > > data1->Append(str.c_str());
> > > > myMutex.unlock();
> > > >
> > > > } while(true);
> > > >
>
=== message truncated ===
__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com