boost::thread编程-线程中断(转)

原文转自 http://blog.csdn.net/anda0109/article/details/41943691

thread的成员函数interrupt()允许正在执行的线程被中断,被中断的线程会抛出一个thread_interrupted异常,它是一个空类,不是std::exception或boost::exception的子类

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <boost/thread.hpp>
#include <boost/atomic.hpp>

boost::mutex io_mu;//io流操作锁

void to_interrupt(boost::atomic_int &x,const std::string &str)
{
    try
    {
        for(int i=0;i<5;++i)
        {
            boost::this_thread::sleep(boost::posix_time::seconds(1));//等待1s
            //Sleep(1000);//等待1s
            boost::mutex::scoped_lock lock(io_mu);//锁定io流操作
            std::cout<<str<<++x<<std::endl;
        }
    }
    catch (boost::thread_interrupted& )//捕获线程中断异常
    {
        std::cout<<"thread interrupted!"<<std::endl;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    boost::atomic_int x(0);
    boost::thread t(to_interrupt,ref(x),"hello");
    boost::this_thread::sleep(boost::posix_time::seconds(2));//休眠2s
    t.interrupt();//要求线程中断执行
    t.join();//由于线程已经中断,所以立即返回
    getchar();
    return 0;
}

程序运行结果如下:

hello1
hello2
thread interrupted!

由运行结果可知,线程在执行了两次循环之后中断执行。

上面程序中使用了boost::this_thread::sleep()函数,如果换成windows API函数Sleep(1000),重新运行,则发现线程并没有终止。读者可自行试验。

这就说明线程并不是在任何时候都可以中断的。

线程中断点:

线程并非在任何时候都可以中断的,thread库定义了若干个中断点,只有当线程执行到中断点的时候才可以被中断,一个线程可以有若干个线程中断点。

thread库定义了9个中断点,它们都是函数,如下:

thread::join();

thread::timed_join();
condition_variable::wait();
condition_variable::timed_wait();
condition_variable_any::wait();
condition_variable_any::timed_wait();
thread::sleep();

this_thread::sleep();

this_thread::interruption_point();

这些中断点的前8个都是某种形式的等待函数,表明线程在阻塞的时候可以被中断。而最后一个this_thread::interruption_point();则是一个特殊的中断点函数,它并不等待,只是起到一个标签的作用,表示线程执行到这个地方可以被中断。

注:在xp环境下使用this_thread::sleep的时候会报错,

无法定位程序输入点GetTickCount64 在动态链接库kernel32.dll上 错误

解决方法:在stdafx.h中加#define _WIN32_WINNT 0x0501

时间: 2024-11-08 18:16:44

boost::thread编程-线程中断(转)的相关文章

C++ 系列:Boost Thread 编程指南

转载自:http://www.cppblog.com/shaker/archive/2011/11/30/33583.html 作者: dozbC++ Boost Thread 编程指南0 前言1 创建线程2 互斥体3 条件变量4 线程局部存储5 仅运行一次的例程6 Boost线程库的未来7 参考资料:0 前言 标准C++线程即将到来.CUJ预言它将衍生自Boost线程库,现在就由Bill带领我们探索一下Boost线程库.就在几年前,用多线程执行程序还是一件非比寻常的事.然而今天互联网应用服务程

Boost::thread库的使用

阅读对象 本文假设读者有几下Skills [1]在C++中至少使用过一种多线程开发库,有Mutex和Lock的概念. [2]熟悉C++开发,在开发工具中,能够编译.设置boost::thread库. 环境 [1]Visual Studio 2005/2008 with SP1 [2]boost1.39/1.40 概要 通过实例介绍boost thread的使用方式,本文主要由线程启动.Interruption机制.线程同步.等待线程退出.Thread Group几个部份组成. 正文 线程启动 线

Boost::Thread 多线程的基础知识

Boost.Thread可以使用多线程执行可移植C++代码中的共享数据.它提供了一些类和函数来管理线程本身,还有其它一些为了实现在线程之间同步数据或者提供针对特定单个线程的数据拷贝.头文件:#include <boost/thread.hpp> 线程定义boost::thread 类是负责启动和管理线程.每个boost::thread对象代表一个单独的执行线程,是不可拷贝的.由于它是可以被移动到,所以它们可以被保存到会改变大小的容器中,并且从函数返回.这使得线程创建的详细信息可以被封装到一个函

JAVA 并发编程之线程中断的控制

今天,拿一个简单例子来说明线程中断的控制. 场景:在特定的目录,寻找特定的文件,如果找到,则10秒线程中断.如果没找到,直接抛出InterruptedException异常,并在run()方法捕获处理这个异常. 1.创建一个类名为FileSearch类,并且实现Runnable接口. public class FileSearch implements Runnable{} 2.声明两个私有属性,一个是将要查找的文件的目录,一个是文件名称.并且实现构造器,初始化这两个属性. //文件目录    

转:【Java并发编程】之二:线程中断(含代码)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/17091267 使用interrupt()中断线程 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回.这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行. 下面一段代码演示了休眠线程的中断: [java] view plain c

boost::thread boost库线程

一.boost::thread的创建 1.线程创建方法一: boost::shared_ptr<boost::thread> writeThread_; boost::function0<void> f = boost::bind(&DBTaskMgr::execute, this); writeThread_ = boost::shared_ptr<boost::thread>(new boost::thread(f)); 2.线程创建方法二: boost::

java基础知识回顾之java Thread类学习(十二)-- 线程中断

官方文档翻译: 如果本线程是处于阻塞状态:调用线程的wait(), wait(long)或wait(long, int)会让它进入等待(阻塞)状态,或者调用线程的join(), join(long), join(long, int), sleep(long), sleep(long, int)也会让它进入阻塞状态.若线程在阻塞状态时,调用了它的interrupt()方法,那么 它的“中断状态”会被清除并且会收到一个InterruptedException异常.例如,线程通过wait()进入阻塞状

boost::thread 线程锁

1.boost锁的概述: boost库中提供了mutex类与lock类,通过组合可以轻易的构建读写锁与互斥锁. 2.mutex对象类(主要有两种): 1.boost::mutex(独占互斥类) --> 有lock和unlock方法 2.boost::shared_mutex(共享互斥类) --> 有lock和unlock方法 And shared_lock和shared_unlock方法 3. lock模板类: 1.boost::unique_lock<T>(独占锁) : uniq

《Java并发编程》之线程中断与终止线程运行

Java中启动一个线程很容易,通常情况下我们都是等到任务运行结束后让线程自行停止.但有时需要在任务正在运行时取消他们,使得线程快速结束.对此Java并没有提供任何机制.但是我们可以通过Java提供的线程中断机制来实现. 首先来看Thread类三个和中断有关的方法: public class Thread { // 发出一个中断请求,把标志位设定为中断状态,不会终止线程运行. // 其他线程试图调用该方法,会检测是否有权限中断该线程(正常情况 // 下不会存在权限问题,这里可以忽略) public