【UE·多线程】UE4 多线程同步之线程锁FScopeLock
日常多线程开发过程中,线程同步是最基本的需求,各操作系统也给我们提供了相应的同步内核对象,例如Windows中的原子(Atomic),临界区(Critical Section),互斥量(Mutex),信号量(Semaphore),还有事件(Event),做过Windows平台开发的朋友,对这些东西肯定非常熟悉了,同理Linux也是有自身的相关的东西,这些都属于内核对象,是系统层面提供的,QT,UE4等其他工具只是实现了对这些内核对象的封装而已,所以这些东西的原理也都大差不差,一通百通,UE4也是在上层抽象出了不同平台的接口,在windows平台下,UE4 临界区的代码片段如下
class FWindowsCriticalSection
{Windows::CRITICAL_SECTION CriticalSection;
public:FORCEINLINE FWindowsCriticalSection(){CA_SUPPRESS(28125);Windows::InitializeCriticalSection(&CriticalSection);Windows::SetCriticalSectionSpinCount(&CriticalSection,4000);}FORCEINLINE ~FWindowsCriticalSection(){Windows::DeleteCriticalSection(&CriticalSection);}FORCEINLINE void Lock(){Windows::EnterCriticalSection(&CriticalSection);}FORCEINLINE bool TryLock(){if (Windows::TryEnterCriticalSection(&CriticalSection)){return true;}return false;}FORCEINLINE void Unlock(){Windows::LeaveCriticalSection(&CriticalSection);}
private:FWindowsCriticalSection(const FWindowsCriticalSection&);FWindowsCriticalSection& operator=(const FWindowsCriticalSection&);
};
跟踪一下,Windows::InitializeCriticalSection(&CriticalSection);,在Windows平台下它确实调用的是Windows系统的InitializeCriticalSection API函数
UE4的线程同步对象有很多,今天我们先来看一下线程锁,FScopeLock,它实现了一个区域级别的锁,它的实现需要注意两点
- 构造FScopeLock时需要一个临界区对象
FCriticalSection cs;
- 用大括号将需要同步的代码块包住,FScoppeLock的对象放在大括号第一行(待验证,UE4引擎中有些代码并没有按照这个规则
FScopeLock lock(cs);
伪代码如下
#include "Misc/ScopeLock.h"
void ThreadFunction()
{//不需要同步代码块{//需要同步代码块,lock必须在第一行FScopeLock lock(&cs);}//不需要同步代码块
}
那此时大括号的内容就被锁住,同一时间,只允一个线程访问临界资源
【UE·多线程】UE4 多线程同步之线程锁FScopeLock相关推荐
- Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步
主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...
- java 多线程 张孝祥_多线程11_张孝祥 java5的线程锁技术
本例子因为两个线程公用同线程中,使用同一个对象,实现了他们公用一把锁,实现了同一个方法的互斥. package locks; /** *会被打乱的效果 */ public class LockTest ...
- Python之线程同步与线程锁
https://blog.csdn.net/u013008795/article/details/91357383
- python 线程锁_Python3多线程执行任务含线程同步锁
Python启动多线程执行任务,用线程锁实现同步分配任务,最后等待所有线程执行完毕#python3多线程演示 import threading import random import time to ...
- python多线程,线程锁
python使用多线程, 不一定运行速度快,这里引入GIL(global interpreter lock) python解释器中任意时刻都只有一个线程在执行; GIL执行过程: 1). 设置一个GI ...
- Python 多线程如何按照任务优先级顺序执行,并根据任务分配来申请线程锁
文章目录 项目介绍 总结 项目介绍 模拟一个场景,有一个工作站,工作站内有一台机器人负责抓取站内四个瓶子进行一系列工作流程,如扫描.称重.加热等动作,但瓶子加热需要较长的时间,机器人在将瓶子放到加热台 ...
- 线程安全(二)Lock 什么是Lock线程锁?与synchronized区别在哪?Lock锁是如何实现等待通知的?如何实现线程顺序执行?
文章目录 前言 一.synchronized的缺陷 二.Lock接口的特性及基本方法 接口的特性 接口基本的方法: 三.ReentrantLock介绍及实例 ReentrantLock类常见方法: l ...
- python线程同步锁_Python实现的多线程同步与互斥锁功能示例
本文实例讲述了Python实现的多线程同步与互斥锁功能.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 import threading i ...
- 史上最强多线程面试44题和答案:线程锁+线程池+线程同步等
最全BAT必考题答案系列 最全MySQL面试60题和答案 史上最全Spring面试71题与答案 史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等 分布式缓存Redis+Memc ...
最新文章
- 在网页中JS函数自动执行常用三种方法
- iOS9.2 xcode 7.1.1真机测试
- IOS FRAMEWORK,动态库 等几个问题
- JVM_04 字符串常量池(详解intern( ))
- DELPHI 7 动态链接库DLL断点调试
- 关于mybatis的mapper和mapper.xml注入spring托管的方法 超详细
- 面向串口编程java_Java串口编程例子
- swift4.1 系统学习十 函数
- nginx url 重写_Nginx重写URL规则示例
- C++中的->用于赋值
- mysql.server的路径_WindowsMysqlServer重启,log-bin路径配置
- 嵌入式C高质量编程培训心得笔记
- DllRegisterServer引出函数实现
- TI 16位 3.3V--5V 电平转换芯片 SN74ALVC164245
- 计算机本地连接无internet访问权限,Win7本地连接IPV4无访问权限怎么解决?
- C++查詢wry.dat中的IP地址信息
- 使用Charles 抓取数据包
- 购物车(session版)
- VRChat火了,但VR社交还没迎来最好的时代
- [PHP] PHP7.4.2安全和修复版本的更改日志