【问题标题】:Interruptible thread implementation with Boost::threadBoost::thread 的可中断线程实现
【发布时间】:2016-02-23 14:58:19
【问题描述】:

我正在使用 Boost::thread 来实现 InterruptibleThread 类,但在执行期间出现分段错误。有什么想法吗?

源码和输出如下。

interruptiblethread.h

#ifndef INTERRUPTIBLETHREAD_H
#define INTERRUPTIBLETHREAD_H

#include <boost/thread.hpp>
#include <boost/thread/future.hpp>
#include <boost/thread/tss.hpp>

class InterruptFlag
{
public:
    inline void set()
    {
        boost::lock_guard<boost::mutex> guard(_mtx);
        _set = true;
    }

    inline bool is_set()
    {
        std::cout << "is_set()" << std::endl;
        boost::lock_guard<boost::mutex> guard(_mtx);
        std::cout << "is_set() end" << std::endl;       
        return _set;
    }

private:
    boost::mutex _mtx;
    bool _set;
};

extern boost::thread_specific_ptr<InterruptFlag> this_thread_interrupt_flag;

class InterruptibleThread
{
public:
    template<typename FunctionType>
    InterruptibleThread(FunctionType f)
    {
        boost::promise<InterruptFlag*> p;
        _internal_thread = boost::thread([f, &p]()
        {
            p.set_value(this_thread_interrupt_flag.get());
            f();
        });
        _interrupt_flag = p.get_future().get();
    }

    inline void interrupt()
    {
        if (_interrupt_flag != nullptr)
        {
            _interrupt_flag->set();
        }
    }

private:
    boost::thread _internal_thread;
    InterruptFlag* _interrupt_flag;
};

#endif // INTERRUPTIBLETHREAD_H

interruptiblethread.cpp

#include <iostream>
#include <functional>

#include "interruptiblethread.h"

using std::cout; using std::endl;
using std::function;

boost::thread_specific_ptr<InterruptFlag> this_thread_interrupt_flag;

struct thread_interrupted {};

void interruption_point()
{
    cout << "interruption_point()" << endl;
    if (this_thread_interrupt_flag->is_set())
    {
        cout << "is_set" << endl;       
        throw thread_interrupted();
    }
}

void foo()
{
    while (true)
    {
        cout << "iterate" << endl;
        try
        {
            interruption_point();
        } catch (const thread_interrupted& interrupt)
        {
            cout << "catch thread_interrupted" << endl;
            break;
        }
    }
}

int main()
{
    InterruptibleThread int_thread(foo);
    int_thread.interrupt();
    while (true) {}
}

输出:

➜  build ./main
iterate
interruption_point()
is_set()
[1]    44435 segmentation fault  ./main

【问题讨论】:

  • this_thread_interrupt_flag 永远不会“初始化” - 它仍然拥有一个 nullptr?
  • 谢谢伙计。我认为它已被初始化,因为它有输出“is_set()”。虽然我不确定。
  • 我不这么认为。我认为它没有初始化,你对is_set 的调用是UB。请检查这个问题:stackoverflow.com/questions/6021273/…
  • 是的,它有效!它确实需要初始化this_thread_interrupt_flag。真的谢谢你!

标签: c++ multithreading boost


【解决方案1】:

this_thread_interrupt_flag 未初始化。请按照here的描述正确初始化

您对is_set 的呼叫是UB。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多