boost学习之-Thread

本文详细解析了Boost库中线程对象的特性、生命周期管理、线程间交互方式及如何优雅地结束线程。通过实例代码演示了如何创建、调度、检查线程状态,并利用中断机制灵活控制线程执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要点:

1 线程对象不可以复制,但是可以转移;

2 当线程对象析构时,线程变为detached,但线程并未结束;也可以通过detach()方法来显示的detached;

3 等待线程结束,可以用join() or timed_join()方法;

4 可以调用interrupt()方法结束一个线程,线程会在运行到interruption points时抛出boost::thread_interrupted异常; interruption points如下:

     所以,从boost文档这一点上可以知道,要正常手法结束一个线程,而非terminated一个线程,只能在线程的执行代码中设立很多检查点,当在某个检查点处检查,发现线程退出标志被设定,则马上返回,不执行其余工作,从而结束线程;

5 如果不能线程的执行被interrupt,可以通过定义一个boost::this_thread::disable_interruption类型变量实现,从定义到析构中间的代码不会被interrupt的,相反的操作是boost::this_thread::restore_interruption类型;都是通过RIIA来实现的;

6 线程id可以通过get_id()得到;

7 Namespace this_thread有许多常用函数:

Non-member function get_id() Non-member function interruption_point() Non-member function interruption_requested() Non-member function interruption_enabled() Non-member function sleep() Non-member function yield() Class disable_interruption Class restore_interruption Non-member function template at_thread_exit()

8 说了半天,给个例子;  
#include <boost/thread/thread.hpp>
#include <iostream>
void helloworld()
{
    std::cout << "Hello World!" << std::endl;
}

struct helloworld
{
    helloworld(const char* who) : m_who(who) { }
    void operator()()
    {
        std::cout << m_who << "says, \"Hello World.\"" << std::endl;
    }
    const char* m_who;
};
int main()
{
    boost::thread thrd1(&helloworld);
    thrd.join();

    boost::thread thrd2(helloworld("Bob"));
    thrd.join();

    boost::thread thrd3(boost::bind(&helloworld, "Bob"));
    thrd.join();
}


总结,boost中什么都是对象,线程函数也以函数对象的形式被调用;所以说boost中function,bind之类的很重要,因为他们作用是把一般函数转换为函数对象;







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值