FFmpeg-chapter2-C++中的线程

发布于:2025-03-03 ⋅ 阅读:(54) ⋅ 点赞:(0)

1 常规的线程

一般常规的线程如下所示

// CMakeProject1.cpp: 定义应用程序的入口点。
//

#include "CMakeProject1.h"
#include <thread>
using namespace std;

void threadFunction(int index)
{
	for (int i = 0; i < 1000; i++)
	{
		std::cout << "Thread: " << i << "--" << index << std::endl;
	}
}


int main()
{
	// 创建线程
	std::thread t1(threadFunction, 10);
	std::thread t2(threadFunction, 20);

	// 线程的两种管理方式
	t1.join();					// 线程同步,主线程会等待线程 t 完成后继续运行
	//t.detach();				// 线程分离,线程 t 会独立运行,主线程不会等待它完成
	t2.join();


	system("pause");
	return 0;
}

这里使用的是VS207+CMake

除过加锁,这段代码在运行的时候容易出现资源共享的情况,改进一下,参看Java中的

2 新的尝试

新建文件夹和文件如图所示

修改最外面的cmakelist.txt

# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
cmake_minimum_required (VERSION 3.8)

project ("CMakeProject1")

# 包含子项目。
add_subdirectory ("CMakeProject1")
add_subdirectory ("MMThread")

MMThread工程下

MMThread.h

#pragma once

// 定义一个类
class MMthread
{
public:
	virtual void run() = 0;		// 纯虚函数,线程会调用这个函数
	int start();				// 启动函数
};

MMThread.cpp

#include "MMThread.h"
#include <thread>


int MMthread::start()
{
	std::thread t(&MMthread::run, this);			// 创建线程,调用自己的纯虚函数,子类继承父类会重新纯虚函数
	t.detach();										// 线程分类

	return 0;
}

里面的CMakeList.txt

# CMakeList.txt: CMakeProject1 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)

# 将源代码添加到此项目的可执行文件。
# 将.cpp/.c/.cc文件生成.a静态库
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
# add_library(库文件名称 STATIC 文件)
add_library(MMThread MMThread.cpp)

# TODO: 如有需要,请添加测试并安装目标。

接着修改CmakeProject1工程(图片叫MMPlayer),这个项目要用到前面项目的库,因此,要在当前目录的上一级开始查找;同时还要将用到的库链接进来

CMakeList.txt

# CMakeList.txt: CMakeProject1 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#
cmake_minimum_required (VERSION 3.8)

# 从上一级开始查找
include_directories(../)

# 将源代码添加到此项目的可执行文件。
add_executable (CMakeProject1 "CMakeProject1.cpp" "CMakeProject1.h")

# TODO: 如有需要,请添加测试并安装目标。

# 对add_library或add_executable生成的文件进行链接操作
# 注意,库文件名称通常为libxxx.so,在这里只要写xxx即可
# target_link_libraries(库文件名称/可执行文件名称 链接的库文件名称)
target_link_libraries(CMakeProject1 MMThread)

CmakeProject1.cpp(上图中的MMPlayer.cpp)

// CMakeProject1.cpp: 定义应用程序的入口点。
//

#include "CMakeProject1.h"
#include <MMThread/MMThread.h>
#include <chrono>
#include <thread>
using namespace std;

class MyMMThread : public MMthread
{
public:
	// 构造函数
	MyMMThread(int _a) : a(_a) {}

	// 实现父类的纯虚函数
	void run() override
	{
		std::cout << "MyMMthread: " << a << std::endl;
	}
	
private:
	int a;
};


int main()
{
	MyMMThread myThread1(10);			// 创建线程
	// 会调用父类的start函数,父类的start函数创建线程,调用纯虚函数,子类实现了纯虚函数,因此会打印
	myThread1.start();


	MyMMThread myThread2(20);			// 创建线程
	myThread2.start();

	// 休眠2s
	std::this_thread::sleep_for(chrono::seconds(2));


	system("pause");
	return 0;
}

测试