我可以为boost线程分配一个清理处理程序吗?

时间:2014-01-30 12:44:08

标签: boost pthreads boost-thread

pthreads中我可以使用清理句柄函数并将它们放在具有pthread_cleanup_push()的堆栈上。 与boost线程有相似的概念吗?

1 个答案:

答案 0 :(得分:1)

不,但您可以通过将线程函数包装到另一个函数中来模仿它,该函数调用您的函数然后调用清理处理程序。

另一种解决方案是将您需要的内容添加到清理处理程序中,并将其放入线程本地存储的析构函数中。但是如果你必须为所有线程调用那个清理处理程序,你必须确保真正使用这样一个线程局部变量,这将归结为包装你的线程函数。

如果要替换pthread_cleanup_push()和pop()调用,我会选择构造函数和析构函数,所以

void roll_back( void* i );
{
   do_rollback( *(int*)i );
}

void thread()
{
    int roll_back_arg = 4;
    pthread_cleanup_push( &roll_back, &roll_back_arg );

    // transaction

    pthread_clean_up_pop( 0 );
}

可以翻译成:

struct roll_back_guard
{
    roll_back_guard( int arg  ) : arg_( arg ), commit_( false ) {}

    void commit() {
        commit_ = true;
    }

    ~roll_back_guard() {
        if ( !commit_ )
            do_rollback( arg_ );
    }
};

void thread()
{
    roll_back_guard guard( 4 );

    // transaction
    guard.commit();
}

通常这种模式称为范围保护。