当前位置: 首页 > article >正文

FFmpeg-chapter2-C++中的线程

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;
}

测试


http://www.kler.cn/a/567040.html

相关文章:

  • 基于 Spring Boot 的 +Vue“宠物咖啡馆平台” 系统的设计与实现
  • Pwntools 的详细介绍、安装指南、配置说明
  • 零信任架构
  • 练习题:61
  • C++杂记——尾递归
  • ‌Tomcat 8.0.12安装流程
  • 【Android】Android Studio 中文乱码问题解决方案
  • 架构案例:从初创互联网公司到分布式存储与反应式编程框架的架构设计
  • 6.指针学习
  • Linux操作系统:基于 Linux 的智能家居系统开发与实现 —— 以 FS - MP1A 嵌入式开发板为例
  • Java多线程与高并发专题——从AQS到ReentrantLock
  • 2025 蓝桥杯 Python 组部分题目解析
  • ffmpeg常用方法(一)
  • 【后端】Docker一本通
  • AI 驱动的智慧大脑:打造企业动态知识库,开启高效管理新时代
  • Vue核心知识:动态路由实现完整方案
  • 单细胞分析(19)—— 单细胞转录组基因集评分方法
  • 代码随想录算法训练营day49(0217)
  • MathJax v2版本中网络慢导致出现 Math Processing Error 问题处理
  • 哔哩哔哩IT私塾python爬虫视频教程中的项目文件