如何在linux上使用boost:thread-C/C++

 我来答
wdghy123
推荐于2018-05-15 · TA获得超过1583个赞
知道大有可为答主
回答量:1514
采纳率:95%
帮助的人:730万
展开全部
首先需要安装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程序。
huanglenzhi
2015-04-02 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
采纳数: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是线程本地存储的访问 指针,用于验证线程本地存储的效果
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式