Boost中Thread类的构造函数有什么用如何实现

noncopyable的基本思想是把构造函数有什么鼡和析构函数设置protected权限这样子类可以调用,但是外面的类不能调用那么当子类需要定义构造函数有什么用的时候不至于通不过编译。泹是最关键的是noncopyable把复制构造函数有什么用和复制赋值函数做成了private这就意味着除非子类定义自己的copy构造和赋值函数,否则在子类没有定义嘚情况下外面的调用者是不能够通过赋值和copy构造等手段来产生一个新的子类对象的。

}

线程就是在同一程序同一时间內允许执行不同函数的离散处理队列。 这使得一个长时间去进行某种特殊运算的函数在执行时不阻碍其他的函数变得十分重要 线程实际仩允许同时执行两种函数,而这两个函数不必相互等待

一旦一个应用程序启动,它仅包含一个默认线程 此线程执行main() 函数。 在main()中被调用嘚函数则按这个线程的上下文顺序地执行 这样的程序称为单线程程序。

反之那些创建新的线程的程序就是多线程程序。 他们不仅可以茬同一时间执行多个函数而且这在如今多核盛行的时代显得尤为重要。 既然多核允许同时执行多个函数这就使得对开发人员相应地使鼡这种处理能力提出了要求。 然而线程一直被用来当并发地执行多个函数开发人员现在不得不仔细地构建应用来支持这种并发。 多线程編程知识也因此在多核系统时代变得越来越重要


在这个库最重要的一个类就是boost::thread,它是在boost/thread.hpp里定义的用来创建一个新线程。下面的示唎来说明如何运用它

新建线程里执行的那个函数的名称被传递到boost::thread的构造函数有什么用。 一旦上述示例中的变量t 被创建该 thread() 函数就在其所茬线程中被立即执行。 同时在test_thread_wait1()里也并发地执行该 threadfun1()

为了防止程序终止,就需要对新建线程调用join() 方法join() 方法是一个阻塞调用:它可以暂停当湔线程,直到调用 join() 的线程运行结束这就使得test_thread_wait1()函数一直会等待到 threadfun1()运行结束。

正如在上面的例子中看到一个特定的线程可以通过诸如t的变量访问,通过这个变量等待着它的使用 join() 方法终止 但是,即使 t 越界或者析构了该线程也将继续执行。 一个线程总是在一开始就绑定到一個类型为 boost::thread 的变量但是一旦创建,就不在取决于它 甚至还存在着一个叫detach()的方法,允许类型为boost::thread 的变量从它对应的线程里分离 当然了,像join()嘚方法之后也就不能被调用因为这个变量不再是一个有效的线程。

任何一个函数内可以做的事情也可以在一个线程内完成 归根结底,┅个线程只不过是一个函数除了它是同时执行的。 在上述例子中使用一个循环把5个数字写入标准输出流。 为了减缓输出每一个循环Φ调用wait() 函数让执行延迟了一秒。 wait() 可以调用一个名为sleep() 的函数这个函数也来自于 Boost.Thread,位于 boost::this_thread

虽然前面的例子说明了如何等待一个不同的线程但丅面的例子演示了如何通过所谓的中断点让一个线程中断。


在一个线程对象上调用 interrupt() 会中断相应的线程在这方面,中断意味着一个类型为boost::thread_interrupted的异常它会在这个线程中抛出。然后这只有在线程达到中断点时才会发生

如果给定的线程不包含任何中断点,简单调用interrupt() 就不会起莋用每当一个线程中断点,它就会检查interrupt() 是否被调用过只有被调用过了, boost::thread_interrupted 异常才会相应地抛出

Boost.Thread定义了一系列的中断点,例如sleep()函数由於sleep()在这个例子里被调用了五次,该线程就检查了五次它是否应该被中断然而sleep()之间的调用,却不能使线程中断

一旦该程序被执行,它只會打印三个数字到标准输出流这是由于在test_thread_wait2()里3秒后调用 interrupt()方法。因此相应的线程被中断,并抛出一个boost::thread_interrupted 异常 这个异常在线程内也被正确地捕获,catch处理虽然是空的由于thread() 函数在处理程序后返回,线程也被终止这反过来也将终止整个程序,因为test_thread_wait2()等待该线程使用join()终止该线程

Boost.Thread定義包括上述 sleep()函数十个中断。有了这些中断点线程可以很容易及时中断。然而他们并不总是最佳的选择,因为中断点必须事前读入以检查boost::thread_interrupted异常


// join()方法是一个阻塞调用:它可以暂停当前线程,直到调用join()的线程运行结束 // timed_join()方法同样也是一个阻塞调用:它可以暂停当前线程, // 直箌调用join()的线程运行结束或者超时 // 当thread 与线程执行体分离时线程执行体将不受影响地继续执行, // 直到运行结束或者随主线程一起结束。
}

 
 

让主进程等待子线程執行完毕后再继续执行
标线程就成为了守护线程驻留后台运行

thread::join()是个简单暴力的方法,主线程等待子进程期间什么都不能做一般情形是主线程创建thread object后做自己的工作而不是简单停留在join上。
thread::join()还会清理子线程相关的内存空间此后thread object将不再和这个子线程相关了,即thread object不再joinable了所以join对於一个子线程来说只可以被调用一次,为了实现更精细的线程等待机制可以使用条件变量等机制。

1、可会合(joinable):这种关系下主线程需要明确执行等待操作,在子线程结束后主线程的等待操作执行完毕,子线程和主线程会合这时主线程继续执行等待操作之后的下一步操作。主线程必须会合可会合的子线程在主线程的线程函数内部调用子线程对象的wait函数实现,即使子线程能够在主线程之前执行完毕进入终止态,也必须执行会合操作否则,系统永远不会主动销毁线程分配给该线程的系统资源也永远不会释放。

2、相分离(detached):表礻子线程无需和主线程会合也就是相分离的,这种情况下子线程一旦进入终止状态,这种方式常用在线程数较多的情况下有时让主線程逐个等待子线程结束,或者让主线程安排每个子线程结束的等待顺序是很困难或不可能的,所以在并发子线程较多的情况下这种方式也会经常使用。

工作的时候 想让发布地图单独占用一个线程, 但是发现一些问题

编译的时候出现如下的错误

 
大意错误就是, 多线程函数不能是非静态成员函数 于是我再各个函数上加了 static bool SlamKarto::updateMap( ) 但是编译再次出错, 还是很傻的错误
(1)普通数据成员属于类的一个具体的对潒,只有对象被创建了普通数据成员才会被分配内存。而静态数据成员属于整个类即使没有任何对象创建,类的静态数据成员变量也存在
(2)因为类的静态数据成员的存在不依赖与于任何类对象的存在,类的静态数据成员应该在代码中被显式地初始化一般要在类外進行,例如上例在C++11标准中,我们可以为静态成员提供const整数类型的类内初始值不过要求静态成员必须是字面值常量类型的constexpr(源自C++Primer中文版270頁)。
(3)外部访问类的静态成员能直接通过类名来访问例如:test::getCount()。虽然静态成员不属于类的某个对象但是我们仍然可以使用类的对象、引用或指针来访问静态成员(源自C++Primer中文版269页),例如:
(4)类的静态成员函数无法直接访问普通数据成员(可以通过对象名间接的访问)洏类的任何成员函数都可以访问类的静态数据成员。
(5)静态成员和类的普通成员一样也具有public、protected、private3种访问级别,也可以具有返回值、const修飾符等参数
}

我要回帖

更多关于 构造函数有什么用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信