在pthreads
中我可以使用清理句柄函数并将它们放在具有pthread_cleanup_push()
的堆栈上。
与boost线程有相似的概念吗?
答案 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();
}
通常这种模式称为范围保护。