boost thread库,奇怪的文档没有Tutorial的库,但是却仍然相当强大

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

boost::thread库,奇怪的文档没有Tutorial的库,但是却仍然相当强大

write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie

讨论新闻组及文件

直以来感觉boost的库作为开源的库文档是非常详细的,绝大部分库的文档由浅入深,一般先有Overview,Introduction到简单的Tutorial到复杂的example,再到rationale,应有尽有,但是boost::thread是个例外,没有任何Introduction,Tutorial的内容,上来就是class/typemember function,头文件列举,列举完了了事,连一个example也没有,最奇怪的 boost库文档绝对非其莫属,甚至《Beyond the C++ Standard Library: An Introduction to Boost》这本书中也只字未提thread库,这样的确为学习boost::thread库加大了难度。对于初学者就更难受了,毕竟,本来多线程就是一个不那么容易的东西。。。。

但是,不要以为此库就是boost中最默默无名的库了,为C++添加多线程库的呼声一直比较高(虽然B.S.以前在D&E中认为其应该由第三方库来完成这样和操作平台相关性比较大的内容),亏boost::thread库还提案了好几次,结果文档都没有完善-_-!起码也算是可能进入C++标准的东西,咋能这样呢?

最新的提案信息,可以在其文档中搜寻到,已经进入Revision 1的阶段了。《Multi-threading Library for Standard C++ (Revision 1)

其实,个人认为,一个多线程库可以很简单,实现简单的临界区用于同步就足够应付绝大部分情况了,相对而言,boost::thread这样的库还是稍微庞大了一点。类似于Python中的thread库其实就不错了(据《Programming Python》作者说原型来自于JAVA),通过继承形式使用线程功能(template method模式),还算比较自然,其实我们公司自己内部也实现了一套与之类似的C++版的线程库,使用也还算方便。但是boost::thread走的是另一条路。由于其文档中没有IntroductionTutorial,我纯粹是摸石头过河似的实验,有用的不对的地方那也就靠大家指出来了。

 

一、   Introduction

boost::thread不是通过继承使用线程那种用了template method模式的线程模型,而是通过参数传递函数(其实不仅仅是函数,只要是CallableCopyable(因为需要复制到线程的本地数据)的就行)。这种模型是好是坏,我一下也没有结论,但是boost::thread库的选择总归是有些道理的,起码从个人感觉来说,也更符合标准库一贯的优先使用泛型而不是继承的传统和作风,这样的模型对于与boost::function,boost::bind等库的结合使用的确也是方便了很多,

 

1.      题外话:

假如你对win32/linux下的多线程有一定的了解有助于理解boost::thread的使用,假如没有win32/linux的多线程使用经验,那么起码也需要对多线程程序有概念性的了解,起码对于3个概念要有所了解,context switching,rare conditions, atomic operation,最好也还了解线程间同步的一些常见形式,假如对于我上面提及的概念都不了解,建议先补充知识,不然,即便是HelloWorld,估计也难以理解。 另外,毕竟本文仅仅是个人学习boost::thread库过程中的一些记录,所以不会对操作系统,线程等知识有透彻的讲解,请见谅。

 

2.      boost::threadHelloWorld:

example1:

#include <windows.h>

#include <boost/thread.hpp>

#include <iostream>

using namespace std;

using namespace boost;

 

void HelloWorld()

{

    char* pc = "Hello World!";

    do

    {

       cout <<*pc;

    }while(*pc++);

    cout <<endl;

}

 

void NormalFunThread()

{

    thread loThread1(HelloWorld);

    thread loThread2(HelloWorld);

    HelloWorld();

 

    Sleep(100);

}

 

int main()

{

    NormalFunThread();

 

    return 0;

}

 

不知道如此形式的程序够不够的上一个threadhelloworld程序了。但是你会发现,boost::thread的确是通过构造函数的方式,(就是构造函数),老实的给我们创建了线程了,所以我们连一句完成的helloworld也没有办法正常看到,熟悉线程的朋友们,可以理解将会看到多么支离破碎的输出,在我的电脑上,一次典型的输出如下:

HHeellloHl eoWl olWrool rdWl!od

l d

!

呵呵,其实我不一次输出整个字符串,就是为了达到这种效果-_-!这个时候需要同步,join函数就是boost::thread为我们提供的同步的一种方式,这种方式类似于利用windows API WaitForSingleObject等待线程结束。下面利用这种方式来实现。

example2:

#include <boost/thread.hpp>

#include <iostream>

using namespace std;

using namespace boost;

 

void HelloWorld()

{

    char* pc = "Hello World!";

    do

    {

       cout <<*pc;

    }while(*pc++);

    cout <<endl;

}

 

void NormalFunThread()

{

    thread loThread1(HelloWorld);

    loThread1.join();

    thread loThread2(HelloWorld);

    loThread2.join();

    HelloWorld();

 

}

 

int main()

{

    NormalFunThread();

 

    return 0;

}

 

这样,我们就能完成的看到3hello world了。但是这种方式很少有意义,因为实际上我们的程序同时还是仅仅存在一个线程,下一个线程只在一个线程结束后才开始运行,所以,实际中使用的更多的是其他同步手段,比如,临界区就用的非常多,但是我在boost::thread中没有找到类似的使用方式,倒是有mutex(互斥),其实两者对于使用是差不多的。下面看使用了mutex同步线程的例子:

example3:

#include <windows.h>

#include <boost/thread.hpp>

#include <boost/thread/mutex.hpp>

#include <iostream>

using namespace std;

using namespace boost;

 

 

mutex mu;

void HelloWorld()

{

    mu.lock();

    char* pc = "Hello World!";

    do

    {

       cout <<*pc;

    }while(*pc++);

    cout <<endl;

    mu.unlock();

}

 

void NormalFunThread()

{

    thread loThread1(HelloWorld);

    thread loThread2(HelloWorld);

    HelloWorld();

 

    loThread1.join();

    loThread2.join();

}

 

int main()

{

    NormalFunThread();

 

    return 0;

}

我们还是能看到3个完好的helloworld,并且,这在实际使用中也是有意义的,因为,在主线程进入HelloWorld函数时,假如第一个线程还没有执行完毕,那么,可能同时有3个线程存在,第一个线程正在输出,第二个线程和主线程在mu.lock();此句等待(也叫阻塞在此句)。其实,作为一个多线程的库,自然同步方式不会就这么一种,其他的我就不讲了。

 

作为boost库,有个很大的有点就是,互相之间结合的非常好。这点虽然有的时候加大了学习的难度,当你要使用一个库的时候,你会发现一个一个顺藤摸瓜,结果都学会了,比如现在,关于boost库的学习进行了很久了,(写了45篇相关的学习文章了),从boost::for_each,boost::bind,boost::lambda,boost::function,boost:: string_algo,到现在的boost::thread,其实原来仅仅是想要好好学习一下boost::asio而已。当你真的顺着学下来,不仅会发现对于C++语言的理解,对STL标准库的理解,对于泛型的理解,等等都有更深入的了解,我甚至在同时学习python的时候,感觉到boost库改变了C++的很多语言特性。。。虽然是模拟出来的。呵呵,题外话说多了,其实要表达的意思仅仅是boost::thread库也是和其他boost库有很多紧密结合的地方,使得其使用会非常的方便。这里一并的在一个例子中演示一下。

example4:

#include <boost/thread.hpp>

#include <boost/thread/mutex.hpp>

#include <iostream>

 

#include <boost/function.hpp>

#include <boost/bind.hpp><

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
CSDN海神之光上传的代码均可运行,亲测可用,直接替换数据即可,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b或2023b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作 功率谱估计: 故障诊断分析: 雷达通信:雷达LFM、MIMO、成像、定位、干扰、检测、信号分析、脉冲压缩 滤波估计:SOC估计 目标定位:WSN定位、滤波跟踪、目标定位 生物电信号:肌电信号EMG、脑电信号EEG、心电信号ECG 通信系统:DOA估计、编码译码、变分模态分解、管道泄漏、滤波器、数字信号处理+传输+分析+去噪(CEEMDAN)、数字信号调制、误码率、信号估计、DTMF、信号检测识别融合、LEACH协议、信号检测、水声通信 1. EMD(经验模态分解,Empirical Mode Decomposition) 2. TVF-EMD(时变滤波的经验模态分解,Time-Varying Filtered Empirical Mode Decomposition) 3. EEMD(集成经验模态分解,Ensemble Empirical Mode Decomposition) 4. VMD(变分模态分解,Variational Mode Decomposition) 5. CEEMDAN(完全自适应噪声集合经验模态分解,Complementary Ensemble Empirical Mode Decomposition with Adaptive Noise) 6. LMD(局部均值分解,Local Mean Decomposition) 7. RLMD(鲁棒局部均值分解, Robust Local Mean Decomposition) 8. ITD(固有时间尺度分解,Intrinsic Time Decomposition) 9. SVMD(逐次变分模态分解,Sequential Variational Mode Decomposition) 10. ICEEMDAN(改进的完全自适应噪声集合经验模态分解,Improved Complementary Ensemble Empirical Mode Decomposition with Adaptive Noise) 11. FMD(特征模式分解,Feature Mode Decomposition) 12. REMD(鲁棒经验模态分解,Robust Empirical Mode Decomposition) 13. SGMD(辛几何模态分解,Spectral-Grouping-based Mode Decomposition) 14. RLMD(鲁棒局部均值分解,Robust Intrinsic Time Decomposition) 15. ESMD(极点对称模态分解, extreme-point symmetric mode decomposition) 16. CEEMD(互补集合经验模态分解,Complementary Ensemble Empirical Mode Decomposition) 17. SSA(奇异谱分析,Singular Spectrum Analysis) 18. SWD(群分解,Swarm Decomposition) 19. RPSEMD(再生相移正弦辅助经验模态分解,Regenerated Phase-shifted Sinusoids assisted Empirical Mode Decomposition) 20. EWT(经验小波变换,Empirical Wavelet Transform) 21. DWT(离散小波变换,Discraete wavelet transform) 22. TDD(时域分解,Time Domain Decomposition) 23. MODWT(最大重叠离散小波变换,Maximal Overlap Discrete Wavelet Transform) 24. MEMD(多元经验模态分解,Multivariate Empirical Mode Decomposition) 25. MVMD(多元变分模态分解,Multivariate Variational Mode Decomposition)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值