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