From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 21159 invoked by alias); 20 Oct 2003 04:59:56 -0000 Mailing-List: contact pthreads-win32-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: pthreads-win32-owner@sources.redhat.com Received: (qmail 21147 invoked from network); 20 Oct 2003 04:59:54 -0000 Received: from unknown (HELO web41001.mail.yahoo.com) (66.218.93.0) by sources.redhat.com with SMTP; 20 Oct 2003 04:59:54 -0000 Message-ID: <20031020045953.6560.qmail@web41001.mail.yahoo.com> Received: from [203.77.203.66] by web41001.mail.yahoo.com via HTTP; Sun, 19 Oct 2003 21:59:53 PDT Date: Mon, 20 Oct 2003 04:59:00 -0000 From: amit mishra Subject: Re: Threading Issue - Program hangs on Ctrl-C - URGENT PLZ To: jasvinder bajwa , pthreads-win32@sources.redhat.com In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-SW-Source: 2003/txt/msg00109.txt.bz2 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 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 > >To: pthread > >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 > 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