본문 바로가기

프로그램언어/boost

[ Boost ] Boost.thread #1

Boost 목록
 

링크 : http://tingcobell.tistory.com/295


boost.thread는 C++에서 멀티스테르에서 안정적인 데이터를 공유할 수 있습니다. boost::thread 라이브러리는

이식성, 유연성에을 고려하여 최대한 효율적으로 구현된 라이브러리입니다. 날짜/시간과 같은 테스크을 조정하고 

파일 시스템 인터페이스, 네트워킹, 원자적 프로그래밍 등 상호간의 조율을 합니다.

메뉴얼을 읽고 있는데 boost로 구현한 thread을 처음 사용하는 것이라서 요목조목 구현 및 테스트를 해보려고 

합니다.


스레드에 간단한 다이어그램을 그린다면 다음과 같이 구성이 될것 입니다. 기본 모델



1. boost::thread을 선언( 다시말하면  스래드 선언? 이정도로 봐야 정확합니다. )
2. boost::join을 통하여 실제로 동작이 됩니다. 
3. 빨간색은 worker 스레드가 동작하는 것을 말합니다.
4. 그러는 동안 노랑색은 sleeping에 빠지게 되죠. 
5. 동작이 끝나면 sleeping 에서 깨어나서 동작을 하게 됩니다. 




만일에 무한으로 worker 스레드가 동작을 하게 되면 어떠한 single이 오기전까지는 이 프로그램은 종료

되지 않습니다. 

간단한 예을 가지고 기본적인 구성과 동작에 대해서 설명을 드리겠습니다.

#include <iostream>

#include <boost/thread.hpp>

#include <boost/date_time.hpp>


void workerFunc()

{

    boost::posix_time::seconds workTime(3);


    std::cout << "Worker: running" << std::endl;


    // Pretend to do something useful...

    boost::this_thread::sleep(workTime);


    std::cout << "Worker: finished" << std::endl;

}


int main(int argc, char* argv[])

{

    std::cout << "main: startup" << std::endl;


    boost::thread workerThread(workerFunc);


    std::cout << "main: waiting for thread\n";


    workerThread.join();


    std::cout << "main: done" << std::endl;


    return 0;

}



 

main 에서 스레드를 객체를 선언합니다. 그런 후에 join을 통해서 동작하게 되는 원리를 가지고 있습니다. 만일에

join 동작을 하지 않을 경우에는  그냥 main 프로세스만 처리하고 종료되가 됩니다.


Reference 을 보고 있으니깐 참고할 사항이 좀 있습니다.

Default Constructor

thread();

Effects: Constructs a boost::thread instance that refers to Not-a-Thread.
Throws: Nothing

Move Constructor

thread(detail::thread_move_t<thread> other);

Effects: Transfers ownership of the thread managed by other (if any) to the newly constructed boost::thread
instance.
Postconditions: other->get_id()==thread::id()
Throws: Nothing

Move assignment operator

template<typename Callable>

thread(Callable func);

Preconditions: Callable must by copyable.
Effects: func is copied into storage managed internally by the thread library, and that copy is invoked on a newlycreated
thread of execution. If this invocation results in an exception being propagated into the internals of
the thread library that is not of type boost::thread_interrupted, then std::terminate() will be
called.
Postconditions: *this refers to the newly created thread of execution.
Throws: boost::thread_resource_error if an error occurs.

Thread Constructor with arguments

template <class F,class A1,class A2,...>

thread(F f,A1 a1,A2 a2,...);

Preconditions: F and each An must by copyable or movable.
Effects: As if thread(boost::bind(f,a1,a2,...)). Consequently, f and each an are copied into internal
storage for access by the new thread.
Postconditions: *this refers to the newly created thread of execution.
Throws: boost::thread_resource_error if an error occurs.
Note: Currently up to nine additional arguments a1 to a9 can be specified in addition to the function f.

Thread Destructor 

~thread();

Effects: If *this has an associated thread of execution, calls detach(). Destroys *this.
Throws: Nothing.

Member function joinable()

bool joinable() const;

Returns: true if *this refers to a thread of execution, false otherwise.
Throws: Nothing
 
Member function join()

void join();

Preconditions: this->get_id()!=boost::this_thread::get_id()
Effects: If *this refers to a thread of execution, waits for that thread of execution to complete.
Postconditions: If *this refers to a thread of execution on entry, that thread of execution has completed. *this no longer
refers to any thread of execution.
Throws: boost::thread_interrupted if the current thread of execution is interrupted.
Notes: join() is one of the predefined interruption points.

'프로그램언어 > boost' 카테고리의 다른 글

[ Boost ] Boost::thread #3  (1) 2011.05.11
[ Boost ] Boost::thread #2  (0) 2011.05.11
[ Boost ] Boost.array 관련 예제 만들어보기  (0) 2011.05.03
[ Boost ] Boost.Array Description  (0) 2011.05.03
[ Boost ] Ref. array.hpp  (4) 2011.05.02