Boost::thread 用法(网络socket引用)TCPIP编程

最终是要使用boost::thread库调度网络编程,tCP套接字。先热热身,参考,参考网上原有的资料。

boost::thread有两个构造函数:
(1)thread():构造一个表示当前执行线程的线程对象;
(2)explicit thread(const boost::function0<void>& threadfunc):
     boost::function0<void>可以简单看为:一个无返回(返回void),无参数的函数。这里的函数也可以是类重载operator()构成的函数;该构造函数传入的是函数对象而并非是函数指针,这样一个具有一般函数特性的类也能作为参数传入,在下面有例子。
第一种方式:最简单方法
#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[])
{
        boost::thread thrd(&hello);
        thrd.join();
        return 0;
}
第二种方式:复杂类型对象作为参数来创建线程:
#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;
}
第三种方式:在类内部创建线程;
(1)类内部静态方法启动线程
#include <boost/thread/thread.hpp>
#include <iostream>
class HelloWorld
{
public:
 static void hello()
 {
      std::cout <<
      "Hello world, I''m a thread!"
      << std::endl;
 }
 static void start()
 {
 
  boost::thread thrd( hello );
  thrd.join();
 }
 
};
int main(int argc, char* argv[])
{
 HelloWorld::start();
 
 return 0;
}
在这里start()和hello()方法都必须是static方法。
(2)如果要求start()和hello()方法不能是静态方法则采用下面的方法创建线程:
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <iostream>
class HelloWorld
{
public:
 void hello()
 {
    std::cout <<
    "Hello world, I''m a thread!"
    << std::endl;
 }
 void start()
 {
  boost::function0< void> f =  boost::bind(&HelloWorld::hello,this);
  boost::thread thrd( f );
  thrd.join();
 }
 
};
int main(int argc, char* argv[])
{
 HelloWorld hello;
 hello.start();
 return 0;
}
(3)在Singleton模式内部创建线程:
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <iostream>
class HelloWorld
{
public:
 void hello()
 {
    std::cout <<
    "Hello world, I''m a thread!"
    << std::endl;
 }
 static void start()
 {
  boost::thread thrd( boost::bind 
                   (&HelloWorld::hello,&HelloWorld::getInstance() ) ) ;
  thrd.join();
 }
 static HelloWorld& getInstance()
 {
  if ( !instance )
      instance = new HelloWorld;
  return *instance;
 }
private:
 HelloWorld(){}
 static HelloWorld* instance;
 
};
HelloWorld* HelloWorld::instance = 0;
int main(int argc, char* argv[])
{
 HelloWorld::start();

 return 0;
}
第四种方法:用类内部函数在类外部创建线程;
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <string>
#include <iostream>
class HelloWorld
{
public:
 void hello(const std::string& str)
 {
        std::cout <<str<< std::endl;
 }
};
 
int main(int argc, char* argv[])
{
 HelloWorld obj;
 boost::thread thrd( boost::bind(&HelloWorld::hello,&obj,"Hello
                               world, I''m a thread!" ) ) ;
 thrd.join();
 return 0;
}

如果线程需要绑定的函数有参数则需要使用boost::bind。比如想使用 boost::thread创建一个线程来执行函数:void f(int i),如果这样写:boost::thread thrd(f)是不对的,因为thread构造函数声明接受的是一个没有参数且返回类型为void的型别,而且不提供参数i的值f也无法运行,这时就可以写:boost::thread thrd(boost::bind(f,1))。涉及到有参函数的绑定问题基本上都是boost::thread、boost::function、boost::bind结合起来使用


现在贴出TCP,Socke套接字的线程的调用代码。

int main()
{
    io_service iosev;
    ip::tcp::endpoint ep(ip::address_v4::from_string("127.0.0.1"), 1000);
    //ip::tcp::socket socket(iosev);
    tcp_class obj(iosev,ep);
    // 连接端点,这里使用了本机连接,可以修改IP地址测试远程连接
    
    boost::system::error_code ec;

    //socket.connect(ep,ec);
    //obj.start();
    if(ec)
    {
        std::cout << boost::system::system_error(ec).what() << std::endl;
        system("pause");
        return -1;
    }
    //HelloWorld obj;
    boost::thread thrd3(boost::bind(&tcp_class::ToRead,&obj,"Reading"));
    boost::thread thrd4(boost::bind(&tcp_class::ToWrite,&obj,"Writing"));
    boost::thread thrd1( boost::bind(&tcp_class::hello,&obj,"Hello_world, I'm a thread___ONE!" ) ) ;
    boost::thread thrd2( boost::bind(&tcp_class::hello1,&obj,"Hello_world, I'm a thread___TWO" ) ) ;
    thrd1.join();
    thrd2.join();
    thrd3.join();
    thrd4.join();
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值