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

【c++游戏小技巧-3】多管齐下·多线程

1.前言

国庆来了,我也复活了,最近我打算写两款游戏(致敬超苦逼冒险者和魂斗罗),不过先更新一下吧。

2.正文

2.1 thread

我只讲这一种,因为我只知道这种

2.1.1 创造线程

#include<iostream>
#include<thread>
using namespace std;
void out(int a){cout<<"\n这是线程"<<a<<"\n";}
int main(){cout<<"主线程:"<<endl;//定义 线程名(函数名,参数)thread nth(out,309);cout<<"主线程中显示子线程id为"<<nth.get_id()<<endl;//获取线程id th2.join();//暂停主线程,运行th2 return 0;
} 

分析:

    //定义 线程名(函数名,参数)thread nth(out,309);

创造了一个对象nth,调用了非默认构造函数;
注意: nth不是一个线程,只是一个对象,不能说这个代码创造了一个线程;

th2.join();//暂停主线程,运行th2 

join是一个成员函数,他的作用是堵塞当前进程,运行一个新线程。

解剖

默认构造函数	thread() noexcept;
初始化构造函数	template <class Fn, class... Args>
explicit thread(Fn&& fn, Args&&... args);
拷贝构造函数 [deleted]	thread(const thread&) = delete;//被禁用
Move 构造函数	thread(thread&& x) noexcept

其他成员函数

get_id: 获取线程 ID,返回一个类型为 std::thread::id 的对象。joinable: 检查线程是否可被 join。检查当前的线程对象是否表示了一个活动的执行线程,由默认构造函数创建的线程是不能被 join 的。另外,如果某个线程 已经执行完任务,但是没有被 join 的话,该线程依然会被认为是一个活动的执行线程,因此也是可以被 join 的。detach: Detach 线程。 将当前线程对象所代表的执行实例与该线程对象分离,使得线程的执行可以单独进行。一旦线程执行完毕,它所分配的资源将会被释放。
调用 detach 函数之后:
*this 不再代表任何的线程执行实例。
joinable() == false
get_id() == std::thread::id()
另外,如果出错或者 joinable() == false,则会抛出 std::system_error。swap: Swap 线程,交换两个线程对象所代表的底层句柄(underlying handles)。native_handle: 返回 native handle(由于 std::thread 的实现和操作系统相关,因此该函数返回与 std::thread 具体实现相关的线程句柄,例如在符合 Posix 标准的平台下(如 Unix/Linux)是 Pthread 库)

std::this_thread 命名空间中相关辅助函数介绍

get_id: 获取线程 IDyield: 当前线程放弃执行,操作系统调度另一线程继续执行sleep_until: 线程休眠至某个指定的时刻(time point),该线程才被重新唤醒
template< class Clock, class Duration >
void sleep_until( const std::chrono::time_point<Clock,Duration>& sleep_time );sleep_for: 线程休眠某个指定的时间片(time span),该线程才被重新唤醒,不过由于线程调度等原因,实际休眠时间可能比 sleep_duration 所表示的时间片更长。
#include<iostream>
#include<chrono>
#include<thread>
int main(){std::cout<<"Hello waiter"<<std::endl;std::chrono::milliseconds dura( 2000 );std::this_thread::sleep_for( dura );std::cout << "Waited 2000 ms\n";
}
执行结果如下:
Hello waiter
Waited 2000 ms

给个赞吧

广告时间

推荐用户优质写文者:L(‘ω’)┘脏脏包└(‘ω’)」


http://www.mrgr.cn/news/41996.html

相关文章:

  • 云原生(四十一) | 阿里云ECS服务器介绍
  • OpenJudge | Binary Tree
  • 1000题-计算机网络系统概述
  • 【高阶数据结构】深度探索二叉树进阶:二叉搜索树概念及其高效实现
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.mapset(模拟实现)
  • 解决ModuleNotFoundError: No module named ‘torchcrf‘
  • 【数据结构】红黑树相关知识详细梳理
  • macos vscode+dosbox 8086汇编语言开发调试环境搭建方法 包含所有相关的工具的下载和安装配置方法
  • 前端面试如何说解vue项目性能优化,你确定不来看看吗?
  • strcmp和strncmp
  • 滚雪球学Oracle[4.4讲]:游标管理
  • 【MySQL】DML数据操作语句和基本的DQL语句
  • 函数式编程的优点和缺点
  • 【寻找one piece的算法之路】——双指针算法!他与她是否会相遇呢?
  • 数字中国建“2522”整体框架
  • Java研发笔记6——C语言程序设计学习笔记5
  • CGLIB原理
  • 影刀RPA实战:excel相关图片操作指令解
  • nodejs:实现大文件的分段上传
  • Cpp::STL—vector类的模拟实现(11)