注:参考自bilibili系列视频,从0开始做播放器---c++线程https://www.bilibili.com/video/BV17g4y1z7Ua
在播放器中,线程的应用非常广泛。如果读文件和解码在一个线程中,读文件耗时的io操作,会影响解码的速度。所以读文件时,需要一个线程,解码也需要一个线程。
#include<thread>
int tstart(const string& tname) {
cout << "Thread test! " << tname << endl;
return 0;
}
int main() {
thread t(tstart, "C++ 11 thread!");
t.join();
cout << "Main Function!" << endl;
}
由创建线程的线程去销毁线程,是个好习惯。
(1) join 会使当前线程阻塞,直到目标线程执行完毕
(2) detach 表示thread对象和其表示的线程完全分离
为了明确线程成员归属问题,我们参考java对线程的封装,也对thread进行封装。
hpp
#include <thread>
class MMThread
{
public:
virtual void run() = 0;
int Start();
int Stop();
public:
std::thread* t = nullptr;
int stopFlag = 0;
};
cpp
#include "MMThread.h"
#include <thread>
int MMThread::Start()
{
if (t == nullptr) {
stopFlag = 0;
t = new std::thread(&MMThread::run, this);
}
return 0;
}
int MMThread::Stop()
{
if (t != nullptr) {
stopFlag = 1;
t->join();
delete t;
t = nullptr;
}
return 0;
}