linux gcc使用C++11的thread库,只有几行程序,出运行时错误

linux gcc使用C++11的thread库,只有几行程序,出运行时错误,第1张

#include <thread>

#include <iostream>

int main(int, char **){

    std::thread tt([](){ std::cout<<"Thread!"<<std::endl })

    tt.join()

} g++  main.cpp -o main.out -pthread -std=c++11//error g++ -Wl,--no-as-needed -std=c++11 -pthread main.cpp -o main.out//ok

这是个很恶心的问题。我乍一看觉得应该是655我再vc6.0上实验(Debug模式)发现结果是555(vc6debug模式汇编代码)004013A8movdwordptr[ebp-4],5;先将5给[ebp-4]004013AFmoveax,dwordptr[ebp-4];再将5传给eax004013B2pusheax将eax压栈004013B3movecx,dwordptr[ebp-4];将5==>ecx004013B6movdwordptr[ebp-20h],ecx将5==>[ebp-20h]004013B9movedx,dwordptr[ebp-20h]将5==>edx004013BCpushedx将5压栈004013BDmoveax,dwordptr[ebp-4]004013C0pusheax;还是将5压栈004013C1pushoffsetstring"%d%d%d\n"(00426000)004013C6movecx,dwordptr[ebp-4]004013C9addecx,1004013CCmovdwordptr[ebp-4],ecx004013CFcallprintf(00401620)004013D4addesp,10h显而易见结果是555了。不过我为了验证又在release下运行了一把,发现结果竟然是656(vc6release模式汇编代码)push6push5push6push407130hcall00401017addesp,10hxoreax,eaxret晕。编译器给优化了。。。显而易见结果是656了还是不死心再看看linux下gcc编译的发现结果也是656(gccdebug)00401326|.C744241C050>movdwordptr[esp+1C],5|现将5放到[esp+1c]中0040132E|.8B44241Cmoveax,dwordptr[esp+1C]|5==>eax00401332|.FF44241Cincdwordptr[esp+1C]|[esp+1c]++[esp+1c]等于6了00401336|.8B54241Cmovedx,dwordptr[esp+1C]|6==>edx0040133A|.8954240Cmovdwordptr[esp+C],edx|这相当于pushedx也就是将6压栈0040133E|.89442408movdwordptr[esp+8],eax|这相当于pusheax也就是将5压栈00401342|.8B44241Cmoveax,dwordptr[esp+1C]|将6放到eax中00401346|.89442404movdwordptr[esp+4],eax|这相当于pusheax也就是将6压栈0040134A|.C70424243040>movdwordptr[esp],00403024|ASCII"%d%d%d",LF00401351|.E836060000call\printf所以结果是656啦gcc的release和debug一样。。还是不死心。有在vc2005的debug下运行了一把发现结果是656??(vc2005debug汇编代码)00411B4Cmovdwordptr[ebp-0Ch],5;5==>[EBP-0c]00411B53moveax,dwordptr[ebp-0Ch]。;5==>eax00411B56movdwordptr[ebp-1194h],eax5==>[ebp-1194h]00411B5Cmovecx,dwordptr[ebp-0Ch]5==>ecx00411B5Faddecx,1ecx++ecx==600411B62movdwordptr[ebp-0Ch],ecx6==>[ebp-0Ch]00411B65movesi,esp00411B67movedx,dwordptr[ebp-0Ch]6==>edx00411B6Apushedx将6压栈00411B6Bmoveax,dwordptr[ebp-1194h];5==>eax00411B71pusheax将5压栈00411B72movecx,dwordptr[ebp-0Ch];6==>ecx00411B75pushecx将6压栈00411B76pushoffsetstring"%d%d%d\n"(41E9ACh)00411B7Bcalldwordptr[__imp__printf(423780h)]00411B81addesp,10h结果是656唉。看来结果就是656啦。。vc2005和以后版本都注意到了这个问题。我也说不上哪个正确,你又相信哪个呢?

首先需要安装boost,步骤如下:

下载到 boost_1_49_0.tar.bz2 (当然,其他压缩格式也可以)后,可以把它放在用户目录下,即:~/

解压缩:tar -jxvf boost_1_49_0.tar.bz2

这样,出现文件夹:~/boost_1_49_0

然后进入:$ cd boost_1_49_0

你会发现有一�¸.sh命令:bootstrap.sh

运行它:$ ./bootstrap.sh     (boost自己的get start文档中说设置参数 --prefix=dir 其中dir为你想指定的安装文件夹,我建议就不用加这个参数,它会默认安装到/usr/local)

结束后出现一个可执行文件: ~/boost_1_49_0/b2

运行这个文件: $ sudo ./b2 install   (Ubuntu用户千万别忘了加sudo,不然安装后将无法完全使用)

编译安装时间比较长,根据不同机器的情况20~40分钟。结束后即安装完毕。

boost::thread的使用

#include <boost/thread.hpp>

#include <iostream>

void task1() { 

    // do stuff

    std::cout << "This is task1!" << std::endl

}

void task2() { 

    // do stuff

    std::cout << "This is task2!" << std::endl

}

int main (int argc, char ** argv) {

    using namespace boost 

    thread thread_1 = thread(task1)

    thread thread_2 = thread(task2)

    // do other stuff

    thread_2.join()

    thread_1.join()

    return 0

}

编译时的命令为:

$ g++ -I./inlcude -L./lib example.cpp -lboost_thread -o example

编译之后会出现一个 example 的可执行文件,可以运行:./example , 结果显示:

This is task2!

This is task1!

可能你在运行时会出现这样的错误:error while loading shared libraries: libboost_thread.so.1.49.0: cannot open shared object file: No such file or directory

这是因为要用到的库不在默认的环境变量里,可以使用下面的命令添加:

$ sudo ldconfig /usr/local/lib

添加后,再执行./example,这样你就完成了你的第一个boost::thread程序。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8792930.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-21
下一篇 2023-04-21

发表评论

登录后才能评论

评论列表(0条)

保存