多线程,什么是多线程?
每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。也就是说,线程是程序执行中运行的最小单元,所以线程基本上是轻量级的进程。随着现在硬件水平,CPU,内存的极大提高,并发编程是一种趋势。
线程优点
1. 线程可以将占据时间长的任务放到后台去处理
如用户界面界面上点击了某个按钮,可以弹出一个进度条来显示处理进度。
2. 程序的运行速度可能加快
在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。
缺点
大量线程,操作系统切换,耗费性能。
更多的线程需要更多的内存空间。
需要预防死锁等等
任何事务都有两面性,显然多线程编程对程序员的要求也就比较高,考虑问题需要更全面。
OK,废话不多说,HelloWord是个宝,还是先从简单的HelloWord来入门。
例一
#include <boost/thread/thread.hpp>
#include <iostream>
void helloworld()
{
std::cout << "Hello World!" << std::endl;
}
int main()
{
boost::thread thrd(&helloworld);
thrd.join();
}
简单编译一下
g++ -I /home/liuyc/app/boost/include -L /home/liuyc/app/boost/lib -o hello1 helloworld.cpp -lboost_thread -lpthread -lrt -lboost_system
可以看到,boost创建线程还是蛮简单的,只有两个操作,boost::thread 声明一个线程,join中断释放线程。
[liuyc@unbuntu tutorial]$hello1
Hello World!
上面的例子很简单,线程就是调用一个helloword函数没有传递参数
例二
#include <boost/thread/thread.hpp>
#include <iostream>
struct helloworld
{
helloworld(const char* who) : m_who(who) { }
void operator()()
{
std::cout << m_who << "says, \"Hello World.\"" << std::endl;
}
const char* m_who;
};
int main()
{
boost::thread thrd(helloworld("Bob"));
thrd.join();
}
简单编译一下
g++ -I /home/liuyc/app/boost/include -L /home/liuyc/app/boost/lib -o hello2 helloworld2.cpp -lboost_thread -lpthread -lrt -lboost_system
这个例子也比较简单,定义了一个结构体,调用传递一个结构体参数“Bob”,
执行结果:
[liuyc@unbuntu tutorial]$hello2
Bobsays, "Hello World."
例子三
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <iostream>
void helloworld(const char* who)
{
std::cout << who << "says, \"Hello World.\"" << std::endl;
}
int main()
{
boost::thread thrd(boost::bind(&helloworld, "Bob"));
thrd.join();
}
简单编译一下
g++ -I /home/liuyc/app/boost/include -L /home/liuyc/app/boost/lib -o hello3 helloworld3.cpp -lboost_thread -lpthread -lrt -lboost_system
执行结果:
[liuyc@unbuntu tutorial]$hello3
Bobsays, "Hello World."
例子三用到了boost库里面另一个强大函数,bind,bind函数其实标准STL库里面已经有了,但是boost封装过后就更强大了,这个后面文章有机会给大家介绍。上面的例子也很清晰,把Bob这个参数绑定到函数helloword。
参考文档
注:大牛的文章值得一读。