Ticket #4978: thread.cpp

File thread.cpp, 1.8 KB (added by d.schneider@…, 12 years ago)

Example code

Line 
1#include <iostream>
2
3#include <boost/format.hpp>
4#include <boost/thread.hpp>
5
6
7typedef boost::shared_ptr<boost::thread> ThreadPtr;
8typedef std::vector<ThreadPtr> Threads;
9typedef Threads::size_type ThreadsSize;
10
11class Test
12{
13public:
14 Test(ThreadsSize threads_count):
15 m_threads_count(threads_count)
16 { }
17
18
19 class Job
20 {
21 public:
22 Job(size_t id, Test& test) : m_id(id), m_test(test)
23 { }
24
25
26 void operator()()
27 {
28 try
29 {
30 std::cout << boost::format("thread %d started\n") % m_id;
31 boost::unique_lock<boost::mutex> lock(m_test.m_lock);
32 std::cout << boost::format("thread %d locked\n") % m_id;
33 m_test.m_cv.wait(lock);
34 std::cout << boost::format("thread %d ended without interrupt\n") % m_id;
35 }
36 catch (boost::thread_interrupted)
37 {
38 std::cout << boost::format("thread %d interrupted\n") % m_id;
39 }
40 }
41 private:
42 size_t m_id;
43 Test& m_test;
44 };
45
46 void operator()()
47 {
48 for (ThreadsSize i = 0; i < m_threads_count; ++i)
49 {
50 ThreadPtr t(new boost::thread(Job(i, *this)));
51 m_threads.push_back(t);
52 }
53
54 // wait until all threads are waiting, unsave!
55 boost::this_thread::sleep(boost::posix_time::seconds(1));
56
57 for (ThreadsSize i = 0; i < m_threads.size(); ++i)
58 {
59 std::cout << boost::format("thread %d interrupt\n") % i;
60 m_threads[i]->interrupt();
61 }
62
63 for (ThreadsSize i = 0; i < m_threads.size(); ++i)
64 {
65 m_threads[i]->join();
66 std::cout << boost::format("thread %d joined\n") % i;
67 }
68 }
69
70private:
71 mutable boost::mutex m_lock;
72 mutable boost::condition_variable m_cv;
73 Threads m_threads;
74 ThreadsSize m_threads_count;
75};
76
77int main(int argc, char *argv[])
78{
79 ThreadsSize threads_count = 10;
80 if (argc > 1)
81 threads_count = atoi(argv[1]);
82
83 Test test(threads_count);
84 test();
85
86 return 0;
87};