c++ 线程

thread库位于名字空间boost,为了使用thread库需要包含头文件<boost/thread.hpp>。

thread对象是不可拷贝的。

当成功创建一个thread对象后,线程就立刻开始执行。

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

template<typename T>
class basic_atom :boost::noncopyable // 原子操作的计数器,可在多线程环境下正确计数
{
private:
	T n;
	typedef boost::mutex mutex_t; // 互斥量类型定义
	mutex_t mu;
public:
	basic_atom(T x = T()) :n(x){}
	T operator++() // 前置式递增操作符
	{
		mutex_t::scoped_lock lock(mu); // 锁定互斥量
		return ++n;
	}
	operator T() // 类型转换操作符定义
	{
		return n;
	}
};

typedef boost::mutex mutex_t;
typedef basic_atom<int> atom_int;
mutex_t io_mu;
void printing(atom_int &x, const std::string &str)
{
	for (int i = 0; i < 5; i++)
	{
		mutex_t::scoped_lock lock(io_mu);
		std::cout << str << ++x << std::endl;
	}
}

int main()
{
	
	atom_int x;
	// 使用临时thread对象启动线程
	boost::thread t1(printing, boost::ref(x), "first"); // 向函数传递参数,使用ref库传递引用
	boost::thread t2(printing, boost::ref(x), "second");
	boost::thread t3(boost::bind(printing, boost::ref(x), "third")); // bind表达式
	t1.join(); // 阻塞等待直到线程结束
	t2.join();
	t3.join();
	return 0;
}
 

  

运行截图:

 

猜你喜欢

转载自www.cnblogs.com/ACGame/p/9101874.html