kończenie wątków

0

witam.
czy ktoś mógłbymi powiedzieć, dla czego "funkcja" nie jest przerywana? szukałem już w wielu miejscach ale nie znalazłem odpowiedzi;/

#include <boost/thread/thread.hpp>
#include <iostream>

using namespace std;

void funkcja()
{
  try
    {
      while(true)
	{
	  sleep(1);
	  cout<<"funkcja"<<endl; 
	}
    }
  catch (const boost::thread_interrupted& ex )
    {
      cout<<"jest przerwanie"<<endl;
      return;
    } 
}

int main( int argc, char** argv )
{
  
  boost::thread t1(funkcja);
  
  cout<<"przed przerwaniem"<<endl;
  t1.interrupt();
  cout<<"po przerwaniu"<<endl;
  sleep(4);
}  

nie wyświetla się nawet napis "jest przerwanie"
z góry dziękuję za pomoc

0

Jest przerywana.
Nie rozumiem dla czego zakładasz że przy przerywaniu ma się wygenerować wyjątek?
Jest przerywana po cichu.

0

return NULL;

0

_13th_Dragon:

[loganek@loganek ~]$ ./a.out 
przed przerwaniem
po przerwaniu
funkcja
funkcja
funkcja
[loganek@loganek ~]$ 

czyli jak widać, wątek nie ejst przerywany

0

Sorka coś mi się pokręciło boost rzeczywiście przerywa z wywaleniem wyjątku.
Z tym że nie w każdym momencie możesz to zrobić.
Może być przerwany podczas wykonania sleep() ale nie tego sleep co uruchamiasz zaś podczas tego sleep:
http://www.boost.org/doc/libs/1_41_0/doc/html/thread/thread_management.html#thread.thread_management.thread.sleep

0

zmieniłem na taki kod:

#include <boost/thread/thread.hpp>
#include <iostream>

using namespace std;

void funkcja()
{
  boost::xtime xt;
  boost::xtime_get(&xt, boost::TIME_UTC);

  try
    {
      while(true)
	{
	  xt.sec+=1;
	  boost::thread::sleep(xt);
	  cout<<"funkcja"<<endl;
	}
    }
  catch (const boost::thread_interrupted& ex )
    {
      cout<<"jest przerwanie"<<endl;
      return;
    }
}
     
int main( int argc, char** argv )
{
  boost::xtime xt;
  boost::xtime_get(&xt, boost::TIME_UTC);
  xt.sec += 5;
  boost::thread t1(funkcja);
     
  cout<<"przed przerwaniem"<<endl;
  t1.interrupt();
  cout<<"po przerwaniu"<<endl;
  boost::thread::sleep(xt);
} 

 

jednak nadal to samo:

[loganek@loganek ~]$ ./a.out 
przed przerwaniem
po przerwaniu
funkcja
funkcja
funkcja
funkcja
[loganek@loganek ~]$ 

ktoś może ma jakiś inny pomysł, dla czego to nie działa?

0

Coś w ten deseń:

... 
while(true)
{
      ...
      boost::this_thread::interruption_point();
}
0

Może nie przerywa ponieważ podczas wydania polecenia interrupt wątek jeszcze nie wystartował.

0
#include <boost/thread/thread.hpp>
#include <iostream>

using namespace std;

void funkcja()
{
  boost::xtime xt;
  boost::xtime_get(&xt, boost::TIME_UTC);

  try
    {
      while(true)
	{
	  xt.sec+=1;
	  boost::thread::sleep(xt);
	  cout<<"funkcja"<<endl;
	  //boost::this_thread::interruption_point(); - gdy to jest odkomentowane, też nie działa;/
	}
    }
  catch (const boost::thread_interrupted& ex )
    {
      cout<<"jest przerwanie"<<endl;
      return;
    }
}
     
int main( int argc, char** argv )
{
  boost::xtime xt;
  boost::xtime_get(&xt, boost::TIME_UTC);
  xt.sec += 2;

  boost::thread t1(funkcja);
  boost::thread::sleep(xt);
  cout<<"przed przerwaniem"<<endl;
  t1.interrupt();
  cout<<"po przerwaniu"<<endl;
  xt.sec += 5;
  boost::thread::sleep(xt);
} 

i niestety, taki kod zwraca następujący wynik:

[loganek@loganek ~]$ ./a.out 
funkcja
przed przerwaniem
po przerwaniu
funkcja
funkcja
funkcja
funkcja
funkcja
[loganek@loganek ~]$ 

więc jak widać, wątek na pewno wystartował

teraz zauważyłem jedną rzecz... dodałem do pętli while następujący fragment:

cout<<"Czy przerwania włączone? :"<<boost::this_thread::interruption_enabled()<<endl;
cout<<"Czy został wysłany sygnał przerwania? :"<<boost::this_thread::interruption_requested()<<endl;

i oto co wyświetla:

[loganek@loganek ~]$ ./a.out 
funkcja
Czy przerwania włączone? :0
Czy został wysłany sygnał przerwania? :0
przed przerwaniem
po przerwaniu
funkcja
Czy przerwania włączone? :0
Czy został wysłany sygnał przerwania? :1
funkcja
Czy przerwania włączone? :0
Czy został wysłany sygnał przerwania? :1
funkcja
Czy przerwania włączone? :0
Czy został wysłany sygnał przerwania? :1
funkcja
Czy przerwania włączone? :0
Czy został wysłany sygnał przerwania? :1
funkcja
Czy przerwania włączone? :0
Czy został wysłany sygnał przerwania? :1
[loganek@loganek ~]$ 

z tego wynika, że sygnał przerwania zostaje wysłany w dobrym momencie, ale przerwania nie można zrobić bo ta możliwość jest wyłączona. ale gdzie włączyć możliwość przerwania wątku? w dokumentacji widzę tylko, że istnieje możliwość zablokowania przerywania

0

to zmień sobie:
while(true)
na
while(!boost::interruption_requested())
i już masz przerwany wątek.

0

no ok, tak działa. wielkie dzięki wszystkim za pomoc. ale dalej zastanawia mnie, dla czego nie działa to tak jak powinno....

0
#include <boost/thread/thread.hpp>
#include <iostream>
 
using namespace std;
 
void funkcja()
{
  boost::xtime xt;
  boost::xtime_get(&xt, boost::TIME_UTC);
 
  try
    {
      while(true)
        {
          xt.sec+=1;
          cout<<"funkcja"<<endl;
		  cout<<"Czy przerwania wlaczone? :"<<boost::this_thread::interruption_enabled()<<endl;
		  cout<<"Czy zostal wyslany sygnal przerwania? :"<<boost::this_thread::interruption_requested()<<endl;
		  cout<<"spanie"<<endl;
          boost::thread::sleep(xt);
		  cout<<"po spaniu"<<endl;
		  cout<<"Czy przerwania wlaczone? :"<<boost::this_thread::interruption_enabled()<<endl;
		  cout<<"Czy zostal wyslany sygnal przerwania? :"<<boost::this_thread::interruption_requested()<<endl;
          //boost::this_thread::interruption_point(); - gdy to jest odkomentowane, tez nie dziala;/
        }
    }
  catch (const boost::thread_interrupted& ex )
    {
      cout<<"jest przerwanie"<<endl;
      return;
    }
}
 
int main( int argc, char** argv )
{
  boost::xtime xt;
  boost::xtime_get(&xt, boost::TIME_UTC);
  xt.sec += 2;
 
  boost::thread t1(funkcja);
  boost::thread::sleep(xt);
  cout<<"przed przerwaniem"<<endl;
  t1.interrupt();
  cout<<"po przerwaniu"<<endl;
  xt.sec += 5;
  boost::thread::sleep(xt);
} 

u mnie, na świeżo ściągniętym pre-built booście, na vs90/2008 dalo wynik:

funkcja
Czy przerwania wlaczone? :1
Czy zostal wyslany sygnal przerwania? :0
spanie
po spaniu
Czy przerwania wlaczone? :1
Czy zostal wyslany sygnal przerwania? :0
funkcja
Czy przerwania wlaczone? :1
Czy zostal wyslany sygnal przerwania? :0
spanie
przed przerwaniem
po przerwaniu
jest przerwanie

czyli interrupt calkowicie poprawnie zadzialal.
sprawdz czy masz poprawnie boosta zbudowanego

0

quetzalcoatl; a jak moge to sprawdzić?

0

jesli sam konfigurowales i kompilowales boost'a jego toolpackiem, to razem z kodem zrodlowym powinny przychodzic unit testy - odpal, sprawdz czy nie ma bledow.

jesli sciagnales skompilowanego boosta skad -- hm.. to sprobuj porownac zachowanie z tymi http://www.boostpro.com/download/ albo tymi http://boost.teeks99.com/
zawsze dotad uzywalem tych z pierszego linku i nigdy nie bylo problemu, teraz na Twoje potrzeby scignalem ot tak dla testu binarki z tego drugiego zrodla, i dzialaja poprawnie.

jesli z obu zrodel beda zachowywac sie blednie, zostaje Ci zbudowac samemu i odpalic testy zeby dowiedziec sie o co chodzi, albo, moze to oznaczac ze masz zle skonfigurowane srodowisko np. sciezki szukania .h/.lib, i ze przez to korzystasz z nie-tych-bibliotek-ktore-sciagnales, i ze masz niesamowity fart/pech ze te-inne-biblioteki-ktorych-przypadkiem-nieswiadomie-uzywasz faktycznie przy tym samym kodzie produkuja "dobre kompilowanie się" projektu..

1 użytkowników online, w tym zalogowanych: 0, gości: 1