#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