#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <iostream>
void hello()
{
std::cout << "this is thread" << std::endl;
}
void name(const std::string& name)
{
std::cout << "this name is:" << name << std::endl;
}
int main(void)
{
boost::thread thrd1(&hello);
boost::thread thrd2(boost::bind(name, "jone"));
thrd1.join();
thrd2.join();
system("pause");
}
-------------------------------------------------------------
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <windows.h>
boost::mutex io_mutex;
static int g_count = 0;
void count1()
{
for (int i=0; i<10; i++)
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << boost::this_thread::get_id() << ":" << ++g_count << std::endl;
::Sleep(10); // for test
}
}
void count2()
{
for (int i=0; i<10; i++)
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << boost::this_thread::get_id() << ":" << ++g_count << std::endl;
::Sleep(11); // for test
}
}
int main(void)
{
boost::thread thrd1(&count1);
boost::thread thrd2(&count2);
thrd1.join();
thrd2.join();
system("pause");
}
-----------------------------------------------------------
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <iostream>
#include <windows.h>
boost::mutex io_mutex;
static int g_count = 0;
void count(int num)
{
for (int i=0; i<num; i++)
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << boost::this_thread::get_id() << ":" << ++g_count << std::endl;
::Sleep(100); // for test
}
}
int main(void)
{
boost::thread thrd1(boost::bind(count, 10));
boost::thread thrd2(boost::bind(count, 20));
thrd1.join();
thrd2.join();
system("pause");
}
-----------------------------------------------------------
#include <boost/circular_buffer.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
#include <boost/thread/thread.hpp>
#include <boost/progress.hpp>
#include <boost/bind.hpp>
template<class T>
class bounded_buffer
{
public:
typedef boost::circular_buffer<T> container_type;
typedef typename container_type::size_type size_type;
typedef typename container_type::value_type value_type;
explicit bounded_buffer(size_type capacity)
: unread_(0), container_(capacity)
{}
void push_front(const value_type& item)
{
boost::mutex::scoped_lock lock(mutex_);
// is_not_full ,
not_full_.wait(lock, boost::bind(&bounded_buffer<value_type>::is_not_full, this));
container_.push_front(item);
++unread_;
lock.unlock();
not_empty_.notify_one(); // notify_one
}
void pop_back(value_type* pItem)
{
boost::mutex::scoped_lock lock(mutex_);
not_empty_.wait(lock, boost::bind(&bounded_buffer<value_type>::is_not_empty, this));
*pItem = container_[--unread_];
lock.unlock();
not_full_.notify_one();
}
private:
bounded_buffer(const bounded_buffer&);
bounded_buffer& operator=(const bounded_buffer&);
bool is_not_empty() const
{
return unread_ > 0;
}
bool is_not_full() const
{
return unread_ < container_.capacity();
}
size_type unread_;
container_type container_;
boost::mutex mutex_;
boost::condition not_empty_;
boost::condition not_full_;
};
int main(void)
{
bounded_buffer<int> buffer(3);
buffer.push_front(1);
buffer.push_front(2);
buffer.push_front(3);
int item;
buffer.pop_back(&item);
std::cout << item << std::endl;
system("pause");
}
#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
#include <boost/thread/xtime.hpp>
#include <boost/bind.hpp>
#include <ctime>
#include <windows.h>
#include <vector>
boost::mutex mut;
boost::condition cond;
bool data_ready;
bool is_data_ready()
{
return (data_ready == true);
}
void prepare_data()
{
std::cout << "prepare data" << std::endl;
}
void process_data()
{
std::cout << "process data" << std::endl;
}
void wait_for_data_to_process()
{
boost::mutex::scoped_lock lock(mut);
cond.wait(lock, boost::bind(is_data_ready)); //
//while (!data_ready)
//{
// cond.wait(lock);
//}
process_data();
}
void prepare_data_for_processing()
{
prepare_data();
{
boost::lock_guard<boost::mutex> lock(mut);
data_ready = true;
}
cond.notify_one();
}
int main()
{
boost::thread th1(wait_for_data_to_process);
boost::thread th2(prepare_data_for_processing);
th1.join();
th2.join();
system("pause");
return 0;
}
-------------------------------------------------------
#include <boost/circular_buffer.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
#include <boost/thread/thread.hpp>
#include <boost/progress.hpp>
#include <boost/bind.hpp>
template<class T>
class bounded_buffer
{
public:
typedef boost::circular_buffer<T> container_type;
typedef typename container_type::size_type size_type;
typedef typename container_type::value_type value_type;
explicit bounded_buffer(size_type capacity)
: unread_(0), container_(capacity)
{}
void push_front(const value_type& item)
{
boost::mutex::scoped_lock lock(mutex_);
// is_not_full ,
not_full_.wait(lock, boost::bind(&bounded_buffer<value_type>::is_not_full, this));
container_.push_front(item);
++unread_;
lock.unlock();
not_empty_.notify_one(); // notify_one
}
void pop_back(value_type* pItem)
{
boost::mutex::scoped_lock lock(mutex_);
not_empty_.wait(lock, boost::bind(&bounded_buffer<value_type>::is_not_empty, this));
*pItem = container_[--unread_];
lock.unlock();
not_full_.notify_one();
}
private:
bounded_buffer(const bounded_buffer&);
bounded_buffer& operator=(const bounded_buffer&);
bool is_not_empty() const
{
return unread_ > 0;
}
bool is_not_full() const
{
return unread_ < container_.capacity();
}
size_type unread_;
container_type container_;
boost::mutex mutex_;
boost::condition not_empty_;
boost::condition not_full_;
};
int main(void)
{
bounded_buffer<int> buffer(3);
buffer.push_front(1);
buffer.push_front(2);
buffer.push_front(3);
int item;
buffer.pop_back(&item);
std::cout << item << std::endl;
system("pause");
}