2
0
mirror of https://github.com/boostorg/thread.git synced 2026-01-23 18:12:12 +00:00
Files
thread/example/condition.cpp
Eric Niebler 63dcef699a Merged revisions 44411-44412,44416-44417,44419,44422,44424 via svnmerge from
https://svn.boost.org/svn/boost/trunk

................
  r44411 | speedsnail | 2008-04-14 06:27:46 -0700 (Mon, 14 Apr 2008) | 2 lines
  
  Added "contrib" subdirectory for user contributed modules that are not yet fully reviewed.
  Added first module: boost.jam for linking to prebuilt (decorated) boost libraries.
................
  r44412 | dgregor | 2008-04-14 06:51:18 -0700 (Mon, 14 Apr 2008) | 1 line
  
  Define is_mpi_datatype appropriately for wchar_t and long long/int64 types
................
  r44416 | dgregor | 2008-04-14 07:57:33 -0700 (Mon, 14 Apr 2008) | 1 line
  
  Fix compilation on GCC 4.3, from Maik Beckmann
................
  r44417 | danieljames | 2008-04-14 08:10:26 -0700 (Mon, 14 Apr 2008) | 55 lines
  
  Add the new allocator constructors, use composition instead of inheritance for the implementation and some small fixes.
  
  Merged revisions 43922,43962,43966,43971,43981,43995-43996,44042,44046-44048,44057 via svnmerge from 
  https://svn.boost.org/svn/boost/branches/unordered/trunk
  
  ........
    r43922 | danieljames | 2008-03-29 14:55:59 +0000 (Sat, 29 Mar 2008) | 1 line
    
    Fix some typos in the reference documentation.
  ........
    r43962 | danieljames | 2008-03-31 18:29:59 +0100 (Mon, 31 Mar 2008) | 1 line
    
    Add a name variable to the release script, so that I can have different release names in different branches.
  ........
    r43966 | danieljames | 2008-03-31 18:43:16 +0100 (Mon, 31 Mar 2008) | 1 line
    
    Fix the image directory for standalone docs.
  ........
    r43971 | danieljames | 2008-03-31 19:17:25 +0100 (Mon, 31 Mar 2008) | 1 line
    
    Fix the unordered stylesheet.
  ........
    r43981 | danieljames | 2008-04-01 13:31:26 +0100 (Tue, 01 Apr 2008) | 2 lines
    
    Cast the pointer in the Visual C++ 6.5 _Charalloc method.
  ........
    r43995 | danieljames | 2008-04-02 12:50:27 +0100 (Wed, 02 Apr 2008) | 1 line
    
    Try using the interprocess containers for testing. Compilation is a bit slower but hopefully I'll run into less cross-platform problems.
  ........
    r43996 | danieljames | 2008-04-02 13:25:49 +0100 (Wed, 02 Apr 2008) | 1 line
    
    Revert my experiment with the interprocess containers. It didn't work out.
  ........
    r44042 | danieljames | 2008-04-04 20:38:09 +0100 (Fri, 04 Apr 2008) | 1 line
    
    Make hash table data a member of hash table, instead of a base.
  ........
    r44046 | danieljames | 2008-04-05 12:38:05 +0100 (Sat, 05 Apr 2008) | 1 line
    
    Remove rvalue_ref from Jamfile.v2 - I didn't mean to check it in.
  ........
    r44047 | danieljames | 2008-04-05 12:39:38 +0100 (Sat, 05 Apr 2008) | 1 line
    
    New constructors with allocators.
  ........
    r44048 | danieljames | 2008-04-05 12:58:11 +0100 (Sat, 05 Apr 2008) | 1 line
    
    Document the new constructors.
  ........
    r44057 | danieljames | 2008-04-05 17:08:23 +0100 (Sat, 05 Apr 2008) | 1 line
    
    Fix some bugs in the exception testing code.
  ........
................
  r44419 | emildotchevski | 2008-04-14 10:31:38 -0700 (Mon, 14 Apr 2008) | 1 line
  
  minor to_string fix
................
  r44422 | johnmaddock | 2008-04-14 11:06:59 -0700 (Mon, 14 Apr 2008) | 1 line
  
  Move Boost.Config build rules into libs/config/test and fix the serialization build rules accordingly.
................
  r44424 | anthonyw | 2008-04-14 14:04:33 -0700 (Mon, 14 Apr 2008) | 1 line
  
  Fix for issue #1657
................


[SVN r44425]
2008-04-14 22:16:44 +00:00

83 lines
1.9 KiB
C++

// 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.hpp>
#include <boost/thread/thread.hpp>
class bounded_buffer : private boost::noncopyable
{
public:
typedef boost::mutex::scoped_lock lock;
bounded_buffer(int n) : 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, buffered;
std::vector<int> circular_buf;
boost::condition buffer_not_full, buffer_not_empty;
boost::mutex monitor;
};
bounded_buffer buf(2);
boost::mutex io_mutex;
void sender() {
int n = 0;
while (n < 100) {
buf.send(n);
{
boost::mutex::scoped_lock io_lock(io_mutex);
std::cout << "sent: " << n << std::endl;
}
++n;
}
buf.send(-1);
}
void receiver() {
int n;
do {
n = buf.receive();
{
boost::mutex::scoped_lock io_lock(io_mutex);
std::cout << "received: " << n << std::endl;
}
} while (n != -1); // -1 indicates end of buffer
}
int main(int, char*[])
{
boost::thread thrd1(&sender);
boost::thread thrd2(&receiver);
thrd1.join();
thrd2.join();
return 0;
}