zoukankan      html  css  js  c++  java
  • boost::thread之while(true)型线程终结方法

    我们的程序中经常会用到线程来执行某些异步操作,而有些时候我们的线程执行的函数是这个样子的:

    1. void ThreadBody()  
    2. {  
    3.     while( true )  
    4.     {  
    5.         std::cout << "Processing..." << std::endl;  
    6.         Sleep(1000);  
    7.     }  
    8. }  

          那么,从理论上讲,这个线程将永远的执行下去,直到这个线程所属的进程运行完毕为止。注意,即使这个线程函数是某个类的成员函数,即使我们创建的,与该线程绑定的boost::thread对象是这个类的成员变量,当这个类被析构的时候,这个线程是仍然在运行的。而当该线程继续访问该类的成员变量或函数的时候,操作系统将抛出异常。这是因为该类(包括其成员变量、函数代码段)所分配的存储空间已经被释放掉了,该线程没有权限再访问这些地址空间。

          所以,我们需要一种方法来终结这样子的线程。下面介绍boost::thread的一种终结这种线程的方法,当然该方法不唯一:

    1. #include <iostream>   
    2. #include <boost/thread.hpp>  
    3.   
    4. /** 注意,windows操作系统下若要编译此程序需要建立的是WIN32控制台属性的工程 */  
    5.   
    6. boost::thread AThread;  
    7.   
    8. void ThreadBody()  
    9. {  
    10.     std::cout << "Thread started." << std::endl;   
    11.       
    12.     try  
    13.     {  
    14.         while( true )  
    15.         {  
    16.             /** 手动在线程中加入中断点,中断点不影响其他语句执行 */  
    17.             boost::this_thread::interruption_point();  
    18.             std::cout << "Processing..." << std::endl;  
    19.             Sleep(100);  
    20.         }   
    21.     }  
    22.     catch(...)  
    23.     {   
    24.         std::cout << "Interrupt exception was thrown." << std::endl;   
    25.     }   
    26.      
    27.     /** 通过该语句可以判断线程先退出还是Destroy函数先退出 */  
    28.     std::cout << "Leave Thread." << std::endl;  
    29. }  
    30.   
    31. void Create()  
    32. {  
    33.     AThread = boost::thread( boost::bind( &ThreadBody ) );  
    34.     std::cout << "Thread created with ID: " << AThread.get_id() << std::endl;  
    35. }  
    36.   
    37. void Destroy()  
    38. {  
    39.     std::cout << "Interrupt thread with ID: " << AThread.get_id() << std::endl;  
    40.       
    41.     /** 向线程发送中断请求 */  
    42.     AThread.interrupt();  
    43.     std::cout << "Joining thread..." << std::endl;      
    44.       
    45.     /** join函数,作用是等待直到线程执行结束;可不加,但不能保证退出Destroy函数前线程被终结 */  
    46.     AThread.join();  
    47.     /** 通过该语句可以判断线程先退出还是Destroy函数先退出 */  
    48.     std::cout << "Leave Destroy Function." << std::endl;  
    49. }  
    50.   
    51. void main()  
    52. {  
    53.     Create();  
    54.     Sleep( 1000 );  
    55.     Destroy();  
    56.   
    57.     int dummy;  
    58.     std::cin >> dummy;  
    59. }  

          那么这样就可以正常的结束这个线程了。当然也可以采用在线程中添加标记变量的方法,比如一个bool型的变量。通过控制这个变量也可以达到线程开关的作用。

  • 相关阅读:
    C语言中返回字符串函数的四种实现方法
    (转)大整数除法jva.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result异常的解决方法
    @Transactional使用try->catch捕获异常并回滚方法
    Golang1.13.x 解决go get 无法下载问题
    Zookeeper:Unable to read additional data from client sessionid 0x00, likely client has closed socket
    解决Linux系统下面javamelody图片中文乱码问题
    mybatis查询mysql的datetime类型数据时间差了14小时
    以太坊多重钱包离线签名
    Solidity智能合约如何判断地址为0或空
    Solidity开发注意
  • 原文地址:https://www.cnblogs.com/lidabo/p/3796554.html
Copyright © 2011-2022 走看看