Мгновенное прерывание Boost :: thread - PullRequest
0 голосов
/ 31 августа 2010

Я пытаюсь реализовать программу, которая запускает функцию, ограниченную фиксированным количеством времени. Мне удалось сделать это с помощью pthreads, но я хотел бы использовать Boost :: thread. До сих пор я кодировал следующее:

#include <boost/thread.hpp>
#include <unistd.h>
#include <signal.h>

#include <iostream>

using namespace std;

boost::thread mythread;

void third_party(){
    std::cout << "hello world" << std::endl;
}
void func (){
    while (1){
        third_party();
        boost::this_thread::interruption_point();
    }
}
void finish(int id){
    mythread.interrupt();
}

int main (){

    mythread = boost::thread(func);

    signal(SIGALRM, finish);
    alarm(2);

    mythread.join();

    return 0;
}

Я установил будильник, который срабатывает через 2 секунды, и позвонил finish, который прервет mythread. Проблема в том, что func остановится только после достижения контрольной точки прерывания. В данном случае я хочу использовать это, third_party (к которому у меня нет кода доступа) может занять много времени, и я не хочу ждать, пока оно достигнет boost::this_thread::interruption_point().

Мне интересно, смогу ли я достичь этого с помощью Boost::thread или даже с более простым способом выполнения упомянутой задачи.

1 Ответ

2 голосов
/ 31 августа 2010

Boost не предоставляет метод для немедленного прерывания, но он предоставляет способ получить дескриптор собственного потока, поэтому, если ваша собственная библиотека потоков поддерживает немедленные прерывания, вы все равно можете использовать этот метод.

Посмотрите на boost :: thread :: native_handle (), чтобы получить доступ к собственному дескриптору.

Возможно, было бы неплохо создать свой собственный класс потока, который предоставляет расширенную функциональность, которая вам нужна, которая наследуется от класса boost :: thread.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...