2009-02-19 11:03:45 +00:00
|
|
|
//
|
|
|
|
// thread.hpp
|
|
|
|
// ~~~~~~~~~~
|
|
|
|
//
|
|
|
|
// Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)
|
|
|
|
//
|
|
|
|
// 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)
|
|
|
|
//
|
|
|
|
|
|
|
|
#ifndef ASIO_THREAD_HPP
|
|
|
|
#define ASIO_THREAD_HPP
|
|
|
|
|
|
|
|
#if defined(_MSC_VER) && (_MSC_VER >= 1200)
|
|
|
|
# pragma once
|
|
|
|
#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
|
|
|
|
|
|
|
|
#include "asio/detail/push_options.hpp"
|
|
|
|
|
|
|
|
#include "asio/detail/noncopyable.hpp"
|
|
|
|
#include "asio/detail/thread.hpp"
|
|
|
|
|
|
|
|
namespace asio {
|
|
|
|
|
|
|
|
/// A simple abstraction for starting threads.
|
|
|
|
/**
|
|
|
|
* The asio::thread class implements the smallest possible subset of the
|
|
|
|
* functionality of boost::thread. It is intended to be used only for starting
|
|
|
|
* a thread and waiting for it to exit. If more extensive threading
|
|
|
|
* capabilities are required, you are strongly advised to use something else.
|
|
|
|
*
|
|
|
|
* @par Thread Safety
|
|
|
|
* @e Distinct @e objects: Safe.@n
|
|
|
|
* @e Shared @e objects: Unsafe.
|
|
|
|
*
|
|
|
|
* @par Example
|
|
|
|
* A typical use of asio::thread would be to launch a thread to run an
|
|
|
|
* io_service's event processing loop:
|
|
|
|
*
|
|
|
|
* @par
|
|
|
|
* @code asio::io_service io_service;
|
|
|
|
* // ...
|
|
|
|
* asio::thread t(boost::bind(&asio::io_service::run, &io_service));
|
|
|
|
* // ...
|
|
|
|
* t.join(); @endcode
|
|
|
|
*/
|
|
|
|
class thread
|
|
|
|
: private noncopyable
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
/// Start a new thread that executes the supplied function.
|
|
|
|
/**
|
|
|
|
* This constructor creates a new thread that will execute the given function
|
|
|
|
* or function object.
|
|
|
|
*
|
|
|
|
* @param f The function or function object to be run in the thread. The
|
|
|
|
* function signature must be: @code void f(); @endcode
|
|
|
|
*/
|
|
|
|
template <typename Function>
|
|
|
|
explicit thread(Function f)
|
2009-04-19 21:40:09 +00:00
|
|
|
: impl_(f)
|
2009-02-19 11:03:45 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Destructor.
|
|
|
|
~thread()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Wait for the thread to exit.
|
|
|
|
/**
|
|
|
|
* This function will block until the thread has exited.
|
|
|
|
*
|
|
|
|
* If this function is not called before the thread object is destroyed, the
|
|
|
|
* thread itself will continue to run until completion. You will, however,
|
|
|
|
* no longer have the ability to wait for it to exit.
|
|
|
|
*/
|
|
|
|
void join()
|
|
|
|
{
|
|
|
|
impl_.join();
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
detail::thread impl_;
|
|
|
|
};
|
|
|
|
|
|
|
|
} // namespace asio
|
|
|
|
|
|
|
|
#include "asio/detail/pop_options.hpp"
|
|
|
|
|
|
|
|
#endif // ASIO_THREAD_HPP
|