日常多线程开发过程中,线程同步是最基本的需求,各操作系统也给我们提供了相应的同步内核对象,例如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相关推荐

  1. Python 多线程总结(2)— 线程锁、线程池、线程数量、互斥锁、死锁、线程同步

    主要介绍使用 threading 模块创建线程的 3 种方式,分别为: 创建 Thread 实例函数 创建 Thread 实例可调用的类对象 使用 Thread 派生子类的方式 多线程是提高效率的一种 ...

  2. java 多线程 张孝祥_多线程11_张孝祥 java5的线程锁技术

    本例子因为两个线程公用同线程中,使用同一个对象,实现了他们公用一把锁,实现了同一个方法的互斥. package locks; /** *会被打乱的效果 */ public class LockTest ...

  3. Python之线程同步与线程锁

    https://blog.csdn.net/u013008795/article/details/91357383

  4. python 线程锁_Python3多线程执行任务含线程同步锁

    Python启动多线程执行任务,用线程锁实现同步分配任务,最后等待所有线程执行完毕#python3多线程演示 import threading import random import time to ...

  5. python多线程,线程锁

    python使用多线程, 不一定运行速度快,这里引入GIL(global interpreter lock) python解释器中任意时刻都只有一个线程在执行; GIL执行过程: 1). 设置一个GI ...

  6. Python 多线程如何按照任务优先级顺序执行,并根据任务分配来申请线程锁

    文章目录 项目介绍 总结 项目介绍 模拟一个场景,有一个工作站,工作站内有一台机器人负责抓取站内四个瓶子进行一系列工作流程,如扫描.称重.加热等动作,但瓶子加热需要较长的时间,机器人在将瓶子放到加热台 ...

  7. 线程安全(二)Lock 什么是Lock线程锁?与synchronized区别在哪?Lock锁是如何实现等待通知的?如何实现线程顺序执行?

    文章目录 前言 一.synchronized的缺陷 二.Lock接口的特性及基本方法 接口的特性 接口基本的方法: 三.ReentrantLock介绍及实例 ReentrantLock类常见方法: l ...

  8. python线程同步锁_Python实现的多线程同步与互斥锁功能示例

    本文实例讲述了Python实现的多线程同步与互斥锁功能.分享给大家供大家参考,具体如下: #! /usr/bin/env python #coding=utf-8 import threading i ...

  9. 史上最强多线程面试44题和答案:线程锁+线程池+线程同步等

    最全BAT必考题答案系列 最全MySQL面试60题和答案 史上最全Spring面试71题与答案 史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等 分布式缓存Redis+Memc ...

最新文章

  1. 在网页中JS函数自动执行常用三种方法
  2. iOS9.2 xcode 7.1.1真机测试
  3. IOS FRAMEWORK,动态库 等几个问题
  4. JVM_04 字符串常量池(详解intern( ))
  5. DELPHI 7 动态链接库DLL断点调试
  6. 关于mybatis的mapper和mapper.xml注入spring托管的方法 超详细
  7. 面向串口编程java_Java串口编程例子
  8. swift4.1 系统学习十 函数
  9. nginx url 重写_Nginx重写URL规则示例
  10. C++中的->用于赋值
  11. mysql.server的路径_WindowsMysqlServer重启,log-bin路径配置
  12. 嵌入式C高质量编程培训心得笔记
  13. DllRegisterServer引出函数实现
  14. TI 16位 3.3V--5V 电平转换芯片 SN74ALVC164245
  15. 计算机本地连接无internet访问权限,Win7本地连接IPV4无访问权限怎么解决?
  16. C++查詢wry.dat中的IP地址信息
  17. 使用Charles 抓取数据包
  18. 购物车(session版)
  19. VRChat火了,但VR社交还没迎来最好的时代
  20. [PHP] PHP7.4.2安全和修复版本的更改日志

热门文章

  1. UE5 Lyra游戏内容制作学习总纲
  2. 创意与工具的奇妙交融:探索专业课软件设计的辉煌未来
  3. Python奇妙之旅-出发吧
  4. 搭建ADG过程中复制报错 RMAN-03009 ORA-03113
  5. Flink广播流——BroadcastStream
  6. 基础算法(一):枚举算法
  7. 【WPA三维路径规划】狼群算法无人机三维路径规划【含Matlab源码 167期】
  8. Pastebot for Mac(剪贴板查看管理软件)
  9. 单点登录(SSO)的实现---通行证的基本原理
  10. 文本框控件TextBox(文本类控件)