Blame view

3rdparty/boost_1_81_0/libs/thread/example/condition.cpp 2.23 KB
73ef4ff3   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  // Copyright (C) 2001-2003
  // William E. Kempf
  //
  //  Distributed under the Boost Software License, Version 1.0. (See accompanying
  //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  
  #include <iostream>
  #include <vector>
  #include <boost/utility.hpp>
  #include <boost/thread/condition_variable.hpp>
  #include <boost/thread/thread_only.hpp>
  #include "../test/remove_error_code_unused_warning.hpp"
  
  class bounded_buffer : private boost::noncopyable
  {
  public:
      typedef boost::unique_lock<boost::mutex> lock;
  
      bounded_buffer(int n) : boost::noncopyable(), begin(0), end(0), buffered(0), circular_buf(n) { }
  
      void send (int m) {
          lock lk(monitor);
          while (buffered == circular_buf.size())
              buffer_not_full.wait(lk);
          circular_buf[end] = m;
          end = (end+1) % circular_buf.size();
          ++buffered;
          buffer_not_empty.notify_one();
      }
      int receive() {
          lock lk(monitor);
          while (buffered == 0)
              buffer_not_empty.wait(lk);
          int i = circular_buf[begin];
          begin = (begin+1) % circular_buf.size();
          --buffered;
          buffer_not_full.notify_one();
          return i;
      }
  
  private:
      int begin, end;
      std::vector<int>::size_type buffered;
      std::vector<int> circular_buf;
      boost::condition_variable_any buffer_not_full, buffer_not_empty;
      boost::mutex monitor;
  };
  
  bounded_buffer buf(2);
  
  boost::mutex io_mutex;
  
  void sender() {
      int n = 0;
      while (n < 1000000) {
          buf.send(n);
          if(!(n%10000))
          {
              boost::unique_lock<boost::mutex> io_lock(io_mutex);
              std::cout << "sent: " << n << std::endl;
          }
          ++n;
      }
      buf.send(-1);
  }
  
  void receiver() {
      int n;
      do {
          n = buf.receive();
          if(!(n%10000))
          {
              boost::unique_lock<boost::mutex> io_lock(io_mutex);
              std::cout << "received: " << n << std::endl;
          }
      } while (n != -1); // -1 indicates end of buffer
      buf.send(-1);
  }
  
  int main(int, char*[])
  {
      boost::thread thrd1(&sender);
      boost::thread thrd2(&receiver);
      boost::thread thrd3(&receiver);
      boost::thread thrd4(&receiver);
      thrd1.join();
      thrd2.join();
      thrd3.join();
      thrd4.join();
      return 0;
  }