C++ 11 引入了线程库, #include <thread>
一般简单的,编写一个线程执行的函数,传递给thread去开启线程,就可以简单的实现多线程程序。
void WorkFun(int param)
{
...
for(int i = 0;i<4;i++)
{
cout<<param<<"Hello, other thread." <<n << endl;
}
...
}
int main()
{
thread t[4];
for(int i = 0;i<4;i++)
{
t[i] = thread(WorkFun,param);
}
}
多线程操作是抢占式执行,当多线程对某一个临界区资源进行访问或修改时,应该对临界区进行加锁,被锁所住的区域称为临界区。
例如上例中,cout标准输出流被多线程抢占式输出时,会造成打印结果乱序的结果。因此对其进行加锁。需要注意的是:频繁的加锁和解锁对性能的消耗是不可忽略的。
#include <mutex>
mutex m;
void WorkFun(int param)
{
...
for(int i = 0;i<4;i++)
{
m.lock();
cout<<param<<"Hello, other thread." <<n << endl;
m.unlock();
}
...
}
对临界区加了所之后,如果临界区内的代码出现异常,或其它原因导致没有解锁或解锁代码没有执行,