简单操作
C++11 加入了并行编程的接口,使用起来非常简单:
#include <iostream>
#include <thread>
void p()
{
while (true)
{
std::cout << "asd" << std::endl;
}
}
void main()
{
std::thread p(p);//多线程启动
p.join();//线程阻塞在这,等待线程执行完毕后退出
}
多线程启动
如果启动了两个线程,那么我们要把join函数放在启动函数下面,如下所示:
std::thread revVlpthead(revVlpData);
std::thread p(p);
revVlpthead.join();
p.join();
如果写成下面这样,则程序会一直等待revVlpData线程退出才执行下面的代码:
std::thread revVlpthead(revVlpData);
revVlpthead.join();//线程结束前程序会停在这里阻塞住
std::thread p(p);
p.join();//线程结束前程序会停在这里阻塞住
在MFC或者其他界面环境下,如果在界面主线程中使用join函数则会造成界面假死的情况,因此可以使用detach函数来分离线程,如下:
std::thread p(p);
p.detach();//程序不会阻塞
值得注意的是,一旦使用detach,就将子线程直接交给系统托管,与进程和主线程无关了。这种情况下,很可能主线程结束,子线程还在运行,使用detach在系统退出的时候需要格外小心,先把其占用的资源释放掉,否则可能造成多线程调用已经被主线程释放的资源的产生错误的问题。
多线程休眠
在线程中可以加入休眠函数让出处理器:
#include <chrono>//时间相关头文件
std::this_thread::sleep_for(std::chrono::seconds(1));//线程休眠一段时间
多线程互斥
在线程共同访问的数据前面,为了保证数据一致性,需要加入互斥体:
包含头文件
#include <mutex>//线程互斥体头文件
static std::mutex exclusive;//线程互斥体
exclusive.lock();
//互斥内存区
exclusive.unlock();
多线程传参
#include <iostream>
#include <thread>
void show(const char* str, const int id)
{
while (true)
{
std::cout << "线程 " << id + 1 << " :" << str << std::endl;
}
}
void main()
{
std::thread t1(show, "hello cplusplus!", 0);
std::thread t2(show, "你好,C++!", 1);
std::thread t3(show, "hello!", 2);
t1.join();
t2.join();
t3.join();
}
类内启用多线程
在类的内部使用多线程的方式和直接调用差异不大,可直接在类中定义多线程的执行函数。
void revVLPDataFromPcap();
在调用该函数的时候有些许差别,代码如下:
std::thread revVLP16Thead(&VLP16::revVLPDataFromPcap, this);//开启接收线程