16 Şubat 2018 Cuma

thread thread Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/thread.hpp>
Ya da şu satırı dahil ederiz.
#include <boost/thread/thread.hpp>
Bu sınıf Windows'ta C kütüphanesinin _beginthreadex metodunu kullanır. Metod şöyledir.
bool thread::start_thread_noexcept()
{
    uintptr_t const new_thread = _beginthreadex(
            0, 
            0, 
            &thread_start_function,     
            thread_info.get(),          
            CREATE_SUSPENDED,           
            &thread_info->id);          

    if (!new_thread)
    {
        return false;
    }

    // why call this line?
    intrusive_ptr_add_ref(thread_info.get());

    thread_info->thread_handle = (detail::win32::handle)(new_thread);
    ResumeThread(thread_info->thread_handle);
    return true;
}
Constructor - Callable global function
Örnek
Şöyle yaparız.
void f1()
{...}

boost::thread t (&f1);
Örnek
Şöyle yaparız.
vector<int> first;
vector<string> second;
unique_ptr<boost::thread> thr =
  make_unique<boost::thread>(testfunc, boost::ref(first), boost::ref(second)));
Constructor - Callable member function
Şöyle yaparız.
boost::thread t(&myClass::myFun, this);
Constructor - Callable + attributes
İmzası şöyle. Variadic template kullanır.
template <class F,class A1,class A2,...>
thread(F f,A1 a1,A2 a2,...);
Şöyle yaparız. thread sınıfının 3 parametreli constructor metodu yok. Callable nesnesine parametre geçmek için boost::bind kullandık.
void WorkerThread (int i)
{...}

boost::thread::attributes attrs = ...;
boost::thread t (attrs, boost::bind (WorkerThread, 10));
Eğer Callable nesnesine parametre geçmek gerekmeseydi şöyle yapardık.
boost::thread::attributes attrs = ...;
boost::thread t (attrs, WorkerThread);
join metodu
Şöyle yaparız.
if(t.joinable())
  t.join();
interrupt metodu
Açıklaması şöyle
"When the interrupted thread next executes one of the specified interruption points (or if it is currently blocked whilst executing one) with interruption enabled, then a boost::thread_interrupted exception will be thrown in the interrupted thread."
Şöyle yaparız. Daha sonra thread'in join() veya timed_join() metodunu çağırıp bitmesini beklemek gerekir.
t.interrupt();
operator = metodu
detach edilmiş bir thread'e yeniden bir şey bağlamak için şöyle yaparız.
boost::thread th = boost::thread(a_lengthy_function);
th.detach();
th = boost::thread(another_function);
timed_join metodu
Şöyle yaparız
t.timed_join(boost::posix_time::milliseconds(timeout_ms));
try_join_for metodu
Örnek ver

swap metodu
Şöyle yaparız.
t.swap(boost::thread(&some_func));

Hiç yorum yok:

Yorum Gönder