source:http://blog.163.com/angtylook@126/blog/static/8388724820111093470947/
之所以叫扯淡,是因为学习线程这部分时,后面一部分看不下去了,笔记也写的够烂。这里给出boost文档汉化项目地址,有兴趣的可以去下载,也期望更多有能力的朋友加进去。
boost文档汉化项目地址:http://code.google.com/p/boost-doc-zh/
Boost.Thread
多线程是听过多了,但却从没有真正接触过。最多是在看《unix环境高级编程》时,敲过书上关于pthread库的例子。这在linux下还好,在windows下虽然也可以在mingw下使用pthread库,但总觉的不怎么爽,可是又不懂怎么使用windows的win32线程。
boost是如何的强大早有耳闻,对它的线程库也早有学习之心。只是之前一直没有成功编译过boost,近日人品爆发,竟然成功了!所以也就了解下里面Boost.Thread库。
书上说可以这样创建一个线程:
boost::thread t(thread_function);
thread_function是个函数,创建后它将在线程中立即执行。
join和detach
boost::thread其中的两个方法join()和detach(),如t.join()会让调用线程等待线程t执行完毕。但调用t.detach()就会让t从对应的线程里分离,此时t将不再代表一个线程,因此不能用t来控制已经分离了的线程。我在想这是不是说分离了的线程将无法控制。
interrupt
线程可以被中断,这太正常了。要想中断线程,调用t.interrupt()。不过并不总是有效的,因为文档说线程唯有在Boost.Thread定义的中断点才会检查interrupt()是否被调用,如果调用那就中断并抛出boost::thread_interrupt异常。哦,对了,中断点就是预定义的一些函数,如sleep;若线程中调用这些函数,那就是一个中断点。
boost::this_thread
boost::this_thread这个名字提供了一些独立的函数,可用于当前的线程。比如sleep()、get_id()。具体有什么用,看看函数名吧,其它就查看文档吧。我真的跑去看文档了,这里记下几个感兴趣的函数吧。
interruption_point() 测试当前线程是否被中断,是刚抛异常。
bool interruption_requested() 是否请求中断当前线程。
线程同步
使用线程肯定逃避不了共享资源的同步问题。想当年学操作系统时,被什么信号量,管程之类的搞到头晕,说实话现在想到这些也在头晕。当看到书上说boost提供多个互斥类,真是恐惧,不过暂时也就只学学最简单的,复杂的用到时再说。
最简单的应该就是这样子:
boost::mutex mutex;
mutex.lock();
critical section;
mutex.unlock();
除了上面这种形式,也可以这样:
boost::lock_guard<boost::mutex> lock(mutex)
critical section;
在boost::lock_guard内部的构造与析构函数内会调用lock()与unlock()。所以当critical section结束时刚好离开作用域,用lock_guard是很方便与适当的。
boost::timed_mutex这个只支持timed_lock(),用在阻塞一段时间,时间过后无论能否获取锁都返回。boost::shared_mutex字面意思,共享互斥量,或许共享锁比较容易理解,不清楚是否可以这样理解。正如lock_guard一样,还有两个类似的boost::unique_lock和boost::shared_lock,后者跟boost::shared_mutex一块用。
同步跟线程局部存储内容很多,看的模模糊糊的,也没法继续写下去了。到此结束,他日回来看懂了,有感觉再继续。