如何在linux上使用boost:thread-C/C++
2个回答
展开全部
首先需要安装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程序。
下载到 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程序。
2015-04-02 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517190
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
使用boost thread的库函数构建多线程的c++程序,了解了基本的thread创建,线程同步以及线程本地存储的使用。都在一个代码实例中进行了 验证。其中还有一个条件变量的使用在不好在一个代码中实现,以后有时间在编写验证一下。
源代码
/*************************************************************************
> File Name: thread_demo.cpp
> Author: Liu Xin
> Mail: liu_x_0625@126.com
> Created Time: 2012年10月14日 星期日 10时54分46秒
************************************************************************/
#include<iostream>
#include<sstream>
#include<boost/thread/thread.hpp>
#include<boost/thread/mutex.hpp>
#include<boost/bind.hpp>
#include<boost/thread/tss.hpp>
using namespace std;
const int MAX_THREAD_NUM=5;
int gCount=0;
boost::mutex mutex;
boost::mutex io_mutex;
boost::thread_specific_ptr<string> ptr; // 线程本地存储访问
void hello(int iThreadId)
{
// 这两个cout语句在多线程的时候还是汇出现io争用的情况,出现打印混乱, 所以要加锁
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << "thread " << iThreadId << ": " <<
"hello world boost thread."
<< std::endl;
std::cout << "thread " << iThreadId << ": " <<
"oh~, I am a little tired, give me 10 seconds, sleeping zzzzz..."
<< std::endl;
}
ptr.reset(new string("hello"));
for(int i=0; i<10; i++)
{
{
boost::mutex::scoped_lock lock(mutex);
stringstream ss;
ss << iThreadId;
(*ptr) = "thread id: " + ss.str();
std::cout << (*ptr) << std::endl;
std::cout << "global count: " << ++gCount << std::endl;
}
sleep(1);
}
}
int main()
{
boost::thread* ths[MAX_THREAD_NUM]={NULL};
for (int i=0; i<MAX_THREAD_NUM; i++)
{
ths[i] = new boost::thread(boost::bind(&hello, i+1));
}
for (int i=0; i<MAX_THREAD_NUM; i++)
ths[i]->join();
std::cout << "thread all finished." << std::endl;
return 0;
}
说明
1、代码实现了一个线程函数,main函数中创建多个线程对象调用该线程函数,并等待每个线程结束
2、线程函数中先输出两行文字,因为io输出是争用资源,需要加锁,否则会出现打印混乱
3、在for循环中,对共享资源gCount进行++操作,同时输出到标准输出中,也许要进行互斥体加锁
4、加锁mutex根据RAII实现,也就是scope_lock,退出{}则自动解锁,因此,此处sleep放在{}外面 是为了验证多线程执行++gCount操作是真正的多线程。如果放在{}里面的话,由于lock还未释放,其他线程会一直等到本线程的for循环执行完成才获得锁,实际上变成了伪多线程了,无意义
5、boost::thread_specific_ptr是线程本地存储的访问 指针,用于验证线程本地存储的效果
源代码
/*************************************************************************
> File Name: thread_demo.cpp
> Author: Liu Xin
> Mail: liu_x_0625@126.com
> Created Time: 2012年10月14日 星期日 10时54分46秒
************************************************************************/
#include<iostream>
#include<sstream>
#include<boost/thread/thread.hpp>
#include<boost/thread/mutex.hpp>
#include<boost/bind.hpp>
#include<boost/thread/tss.hpp>
using namespace std;
const int MAX_THREAD_NUM=5;
int gCount=0;
boost::mutex mutex;
boost::mutex io_mutex;
boost::thread_specific_ptr<string> ptr; // 线程本地存储访问
void hello(int iThreadId)
{
// 这两个cout语句在多线程的时候还是汇出现io争用的情况,出现打印混乱, 所以要加锁
{
boost::mutex::scoped_lock lock(io_mutex);
std::cout << "thread " << iThreadId << ": " <<
"hello world boost thread."
<< std::endl;
std::cout << "thread " << iThreadId << ": " <<
"oh~, I am a little tired, give me 10 seconds, sleeping zzzzz..."
<< std::endl;
}
ptr.reset(new string("hello"));
for(int i=0; i<10; i++)
{
{
boost::mutex::scoped_lock lock(mutex);
stringstream ss;
ss << iThreadId;
(*ptr) = "thread id: " + ss.str();
std::cout << (*ptr) << std::endl;
std::cout << "global count: " << ++gCount << std::endl;
}
sleep(1);
}
}
int main()
{
boost::thread* ths[MAX_THREAD_NUM]={NULL};
for (int i=0; i<MAX_THREAD_NUM; i++)
{
ths[i] = new boost::thread(boost::bind(&hello, i+1));
}
for (int i=0; i<MAX_THREAD_NUM; i++)
ths[i]->join();
std::cout << "thread all finished." << std::endl;
return 0;
}
说明
1、代码实现了一个线程函数,main函数中创建多个线程对象调用该线程函数,并等待每个线程结束
2、线程函数中先输出两行文字,因为io输出是争用资源,需要加锁,否则会出现打印混乱
3、在for循环中,对共享资源gCount进行++操作,同时输出到标准输出中,也许要进行互斥体加锁
4、加锁mutex根据RAII实现,也就是scope_lock,退出{}则自动解锁,因此,此处sleep放在{}外面 是为了验证多线程执行++gCount操作是真正的多线程。如果放在{}里面的话,由于lock还未释放,其他线程会一直等到本线程的for循环执行完成才获得锁,实际上变成了伪多线程了,无意义
5、boost::thread_specific_ptr是线程本地存储的访问 指针,用于验证线程本地存储的效果
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询