sich das folgende Programm:C++: Beenden ohne aktive Ausnahme (GCC) genannt
#include <iostream>
#include <pthread.h>
#include <stdexcept>
#include <unistd.h>
static void* busy(void*)
{
int oldstate ;
auto result = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&oldstate) ;
if (result != 0)
#ifdef NOEXCEPT
{ std::cerr << "pthread_setcanceltype" << std::endl ; abort() ; }
#else
throw std::runtime_error("pthread_setcanceltype") ;
#endif
while (true)
;
return nullptr ;
}
static pthread_t start()
{
pthread_t t ;
int result = pthread_create(&t,nullptr,busy,nullptr) ;
if (result != 0)
throw std::runtime_error("pthread_create") ;
return t ;
}
static void terminate(pthread_t t)
{
auto result = pthread_cancel(t) ;
if (result != 0)
throw std::runtime_error("pthread_cancel()") ;
result = pthread_join(t,nullptr) ;
if (result != 0)
throw std::runtime_error("pthread_join()") ;
}
int main()
{
auto t = start() ;
sleep(1) ; // may not cause an abort otherwise
terminate(t) ;
return 0 ;
}
Dies läuft gut, solange keine Optimierung (oder -O1) verwendet wird, z.B. mit g ++ -std = C++ 11 -Wall -o Test test.cc -thread
Mit -O2 oder -O3 bricht das Programm jedoch mit der obigen Meldung ab.
Auch irgendwie interessant: es läuft durch, wenn mit -DNOEXCEPT kompiliert. So scheint es, wenn ein Thread in einer Funktion abgebrochen wird, die möglicherweise [sic!] Eine Ausnahme auslöst, und wenn die Optimierung eingeschaltet ist, kann das Programm abbrechen. - Und ich kann keinen Weg sehen, das zu verhindern.
Es ist für mich reproduzierbar auf amd64 gcc 4.8.4 (Ubuntu 14.04.3) und armv7l gcc 4.9.2 (Raspbian 4.9.2-10).
Können Sie das reproduzieren? Hast du eine Erklärung? Dieses Verhalten scheint (zumindest für mich) seltsam zu sein. Ich würde mich über Feedback freuen. Vielen Dank!
Ich glaube, der Ort, den Sie erwähnen (bitte Link, wenn sie etwas auf dem World Wide Web beziehen) sprach über 'std :: thread' und nicht über pThreads. – molbdnilo
Ein anderer [nützlicher Artikel] (https://skaark.wordpress.com/2010/08/26/pthread_cancel-condensed-harmful/). Obwohl es nicht genau dein Problem ist, skizziert es andere Probleme mit 'pthread_cancel'. Bearbeiten: ein anderes [ähnliches Problem] (https://gcc.gnu.org/ml/gcc/2007-06/msg00020.html) –
Sie verwenden Pthreads, nicht C++ 11 Threads. In C++ 11-Threads gibt es keine Thread-Löschung. Wie nackte Pthreads mit C++ - Ausnahmen oder integrierten C++ 11-Thread-Funktionen interagieren (die wahrscheinlich noch pthreads auf Ihrer Plattform sind, aber in eine Art C++ - fähigen Wrapper eingebettet sind), ist eine Vermutung. –