浮萍晓生的开发日志

记录学习的旅程,把握可预见的未来

导航

析构函数结束线程测试

Posted on 2013-12-05 18:03  浮萍晓生  阅读(1068)  评论(0编辑  收藏  举报

  经常会碰到线程结束的难题,关系到资源的正确分配/释放,变量的引用,锁/条件变量...于是发现有一次在析构函数中通知结束线程,然后等待线程执行完毕,切换到线程运行时竟然崩溃。最初以为在析构函数中结束是有问题的,所以写了下面的代码进行测。剥离各种复杂的业务代码,经过简单测试,没有任何问题。仔细分析其实是自己释放资源的顺序不对,把线程的运行环境和变量预先销毁了,然后在等待线程执行完毕时注定出错!

  以为自己算是一个码字高手了,但还是漫不经心的犯各种小问题。

  

 1 #include <boost/make_shared.hpp>
 2 #include <boost/thread.hpp>
 3 #include <boost/thread/mutex.hpp>
 4 #include <boost/thread/condition.hpp>
 5 
 6 class simple_thread
 7 {
 8 
 9 public:
10     simple_thread()
11     {
12         m_run_flag = 0;
13     }
14 
15     ~simple_thread()
16     {
17         if (m_thread_grp)
18         {
19             stop();
20 
21             m_thread_grp->join_all();
22 
23             m_thread_grp.reset();
24         }
25     }
26 
27 public:
28     void start()
29     {
30         m_run_flag = 1;
31 
32         m_thread_grp = boost::make_shared<boost::thread_group>();
33 
34         m_thread_grp->create_thread(boost::bind(&simple_thread::thread_proc, this));
35     }
36 
37     void stop()
38     {
39         m_run_flag = 0;
40 
41         m_con_scp.notify_all();
42     }
43 
44     void thread_proc()
45     {
46         std::cout<<"thread_proc starting..."<<std::endl;
47 
48         while (1)
49         {
50             Sleep(10000);
51 
52             if (!m_run_flag)
53             {
54                 break;
55             }
56 
57             boost::mutex::scoped_lock lock(m_mt_scp);
58             m_con_scp.wait(m_mt_scp);
59         }
60 
61         std::cout<<"thread_proc endding...."<<std::endl;
62     }
63 
64 private:
65     int m_run_flag;
66 
67     boost::mutex m_mt_scp;
68     boost::condition m_con_scp;
69     boost::shared_ptr<boost::thread_group> m_thread_grp;
70 };
71 
72 
73 int _tmain(int argc, _TCHAR* argv[])
74 {
75     if (1)
76     {
77         boost::shared_ptr<simple_thread> test = boost::make_shared<simple_thread>();
78         test->start();
79 
80         std::cout<<"object destroying...."<<std::endl;
81     }
82     
83     Sleep(INFINITE);
84 
85     return 0;
86 }
View Code