Boost::Thread使用示例

Boost::Thread的实现总体上是比较简单的,前面已经说过,thread只是一个跨平台的线程封装库,其中按照所使用的线程选项的不同,分别决定使用Windows线程API,pThread,或Mac平台的thread实现。以下只讨论Windows,即使用BOOST_HAS_WINTHREAD的情况。

Boost::Thread有两个构造函数:一个是thread(),构造一个表示当前执行线程的线程对象;一个是explicit thread(const boost::function0<void>& threadfunc),这里的boost::function0<void>可以简单看为一个无返回无参数的函数。这里的函数可以是类重载operator()构成的函数;该构造函数传入的是函数对象而并非是函数指针,这样一个具有一般函数特性的类也能作为参数传入,可以看下面的几个例子。

(1)最简单方法

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

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

int main()
{
	boost::thread thrd(&hello);
	thrd.join();

	system("pause");
	return 0;
}

(2)复杂类型对象作为参数来创建线程

#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()
{
	boost::thread thrd1(count(1));
	boost::thread thrd2(count(2));
	thrd1.join();
	thrd2.join();

	system("pause");
	return 0;
}

(3)在类内部创建线程

类内部静态方法启动线程

#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()
{
	HelloWorld::start();

	system("pause");
	return 0;
}
在这里,start()和hello()方法都必须是static方法。如果要求start()和hello()方法不能是静态方法则采用下面的方法创建线程:

#include <boost/function/function0.hpp>
#include <boost/thread/thread.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()
{
	HelloWorld hello;
	hello.start();

	system("pause");
	return 0;
}

(3)在Singleton模式内部创建线程:

#include <boost/thread/thread.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()
{
	HelloWorld::start();

	system("pause");
	return 0;
}
(4)用类内部函数在类外部创建线程

#include <boost/thread/thread.hpp>
#include <iostream>
#include <string>

class HelloWorld
{
public:
	void hello(const std::string& str)
	{
		std::cout<<str<<std::endl;
    }
};

int main()
{
	HelloWorld obj;
	boost::thread thrd(boost::bind(&HelloWorld::hello, &obj, "Hello World, I'm a thread!"));
	thrd.join();

	system("pause");
	return 0;
}

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

http://www.cnblogs.com/VRS_technology/archive/2010/09/15/1826812.html

http://www.blogjava.net/LittleDS/archive/2008/05/18/201236.html








你可能感兴趣的:(thread,windows,String,function,System,跨平台)