boost thread(1)

原创 2004年10月11日 23:15:00
      想自己试试thread好用不好用。这是boost的一大特色。如果加到standard C++中的话,那么确实能够提高效率。
      晚上调试thread的时候刚开始遇到一个问题
告诉我boost_thread-vc71-mt-gd-1_31.dll找不到。这个问题是这样的,因为在jam的时候只是将release版本的dll拷到了windows/systems32下面去了,没有将debug版本的文件拷过去。所以自己手工将文件拷过去。害的我以为我安装的有问题。让我重新装了一遍。
从最简单的开始:
#include <boost/thread/thread.hpp>
#include <iostream>

void hello()
{
  std::cout <<
    "Hello world, I'm a thread!"
    << std::endl;
}

int main(int argc, char* argv[])
{
//创建一个thread 这个部分是创建完以后立马回到主进程,让线程去跑就是了。
//这个部分和MPI多机并行环境下的程序设计几乎是一样的。只不过一个是单机上的并行
//一个是分布式环境下的并行。

boost::thread thrd(&hello);








thrd.join();
//等待线程返回
return 0; }











使用mutex互斥量
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>

boost::mutex io_mutex;

struct count
{
  count(int id) : id(id) { }

  void operator()()
  {
    for (int i = 0; i < 10; ++i)
    {
      boost::mutex::scoped_lock
        lock(io_mutex);
      std::cout << id << ": "
        << i << std::endl;
    }
  }

  int id;
};

int main(int argc, char* argv[])
{
  boost::thread thrd1(count(1));
  boost::thread thrd2(count(2));
  thrd1.join();
  thrd2.join();
  return 0;
}
更加复杂一些,就是加了一个bind要比上面的代码好的地方在于不必使用functor

#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <iostream>

boost::mutex io_mutex;

void count(int id)
{
  for (int i = 0; i < 10; ++i)
  {
    boost::mutex::scoped_lock
      lock(io_mutex);
    std::cout << id << ": " <<
      i << std::endl;
  }
}

int main(int argc, char* argv[])
{
  boost::thread thrd1(
    boost::bind(&count, 1));
  boost::thread thrd2(
    boost::bind(&count, 2));
  thrd1.join();
  thrd2.join();
  return 0;
}

boost::condition
这个就更加复杂一些
条件变量一般在 mutex 和shared resource的组合中使用.一个进程首先锁定 mutex 然后判断共享资源是不是在可以使用的状态。如果不在那么他就开始等conditional variable.这个操作使得线程在等待的时候 mutex被unlocked 。这样另外一个线程就可以改变共享资源的状态了。这里只要保证在使用共享资源时他的 mutex 是被锁定的就可以了。 当某些进程修改了这样的共享资源时,需要通知一下其他在等待的进程。这样其他进程就可以对出wait状态了。
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
#include <iostream>

const int BUF_SIZE = 10;
const int ITERS = 100;

boost::mutex io_mutex;

class buffer
{
public:
  typedef boost::mutex::scoped_lock
    scoped_lock;
   
  buffer()
    : p(0), c(0), full(0)
  {
  }
   
  void put(int m)
  {
    scoped_lock lock(mutex);
    if (full == BUF_SIZE)
    {
      {
        boost::mutex::scoped_lock
          lock(io_mutex);
        std::cout <<
          "Buffer is full. Waiting..."
          << std::endl;
      }
      while (full == BUF_SIZE)
        cond.wait(lock);
    }
    buf[p] = m;
    p = (p+1) % BUF_SIZE;
    ++full;
    cond.notify_one();
  }

  int get()
  {
    scoped_lock lk(mutex);
    if (full == 0)
    {
      {
        boost::mutex::scoped_lock
          lock(io_mutex);
        std::cout <<
          "Buffer is empty. Waiting..."
          << std::endl;
      }
      while (full == 0)
        cond.wait(lk);
    }
    int i = buf[c];
    c = (c+1) % BUF_SIZE;
    --full;
    cond.notify_one();
    return i;
  }
   
private:
  boost::mutex mutex;
  boost::condition cond;
  unsigned int p, c, full;
  int buf[BUF_SIZE];
};

buffer buf;

void writer()
{
  for (int n = 0; n < ITERS; ++n)
  {
    {
      boost::mutex::scoped_lock
        lock(io_mutex);
      std::cout << "sending: "
        << n << std::endl;
    }
    buf.put(n);
  }
}

void reader()
{
  for (int x = 0; x < ITERS; ++x)
  {
    int n = buf.get();
    {
      boost::mutex::scoped_lock
        lock(io_mutex);
      std::cout << "received: "
        << n << std::endl;
    }
  }
}
   
int main(int argc, char* argv[])
{
  boost::thread thrd1(&reader);
  boost::thread thrd2(&writer);
  thrd1.join();
  thrd2.join();
  return 0;
}






手把手教你:解决boost库编译使用后thread类使用报错的方法

报错如下: libboost_thread-vc110-mt-1_53.lib(thread.obj) : error LNK2038.... error LNK2038: 检测到“_ITERAT...
  • qingyuanluofeng
  • qingyuanluofeng
  • 2014年10月31日 15:35
  • 1541

boost thread使用方法

一、创建一个线程 创建线程    boost::thread myThread(threadFun);    需要注意的是:参数可以是函数对象或者函数指针。并且这个函数无参数,并返回void类型...
  • u013982161
  • u013982161
  • 2016年11月12日 15:29
  • 2496

boost::thread编程-线程中断

thread的成员函数interrupt()允许正在执行的线程被中断,被中断的线程会抛出一个thread_interrupted异常,它是一个空类,不是std::exception或boost::ex...
  • anda0109
  • anda0109
  • 2014年12月15日 15:24
  • 4478

boost::thread使用引用参数

boost::thread到bind始终是使用copy方式,不管是值类型还是引用类型的指针,都是用copy方式传递,导致结果无法取得。 例如: void ReceiveMessage(int msg...
  • zh_geo
  • zh_geo
  • 2015年11月18日 09:34
  • 1053

(原创)boost中thread库的编译

boost中的thread需要编译成dll才能使用。首先,获取boost代码,可以在cmd中敲入cvs -d:pserver:anonymous@boost.cvs.sourceforge.net:/...
  • RAINini
  • RAINini
  • 2008年01月20日 17:34
  • 2515

使用boost.bind绑定class的成员函数作为boost thread的入口

class HelloWorld { public:     void hello();     void entry(); }; void HelloWorld::entry() {     bo...
  • yangry
  • yangry
  • 2011年08月05日 15:35
  • 2474

boost::thread简要分析(1):thread

昨天在写作“大卫的Design Patterns学习笔记”过程中,编写了一个多线程Producer-Consumer的示例,其中用到了boost::thread,但在线程同步的问题上遇到了些问题,到c...
  • billdavid
  • billdavid
  • 2005年05月27日 08:47
  • 3530

boost学习之-Thread

要点: 1 线程对象不可以复制,但是可以转移; 2 当线程对象析构时,线程变为detached,但线程并未结束;也可以通过detach()方法来显示的detached; 3 等待线程结束,可以用...
  • sohu_2011
  • sohu_2011
  • 2012年07月21日 21:48
  • 2331

在Visual Studio 2013上编译boost 1.55并生成libboost_thread

转自: http://srcflow.info/visual-studio-2013boost-155.html#.U3hFjsQW071   在Visual Studio2013(msvc12...
  • ihc523
  • ihc523
  • 2014年05月18日 16:25
  • 7918

boost::thread使用方法

首先调用thread的构造函数 Default Constructor thread(); Effects: Constructs a bo...
  • mcmcmc
  • mcmcmc
  • 2012年10月01日 15:54
  • 1876
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:boost thread(1)
举报原因:
原因补充:

(最多只允许输入30个字)