日常多线程开发过程中,线程同步是最基本的需求,各操作系统也给我们提供了相应的同步内核对象,例如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. nltk 文本预处理
  2. Learning the Vi Editor, 6th Edition学习笔记(0)
  3. linux: kill -9
  4. 求数据流中的第K大元素
  5. adam优化_认识 AdaMod: 一个新的有记忆的深度学习优化器
  6. java程序无法启动_无法打开java小程序?小迅支招
  7. latex数学公式转换器
  8. 【元胞自动机】基于元胞自动机模拟和改进遗传算法的动态网络分配模型分析matlab仿真
  9. Office 2013 Excel 转换 Word
  10. CIO40: IT 人之读书与家庭
  11. 20种简单美化照片PS技术
  12. css学习记录第一天(选择器)
  13. 本周最新文献速递20220508
  14. 缓存Cache-Control
  15. 信任令BIU首发BigONE
  16. iOS 使用 Admob 获取广告收入
  17. linux mint安装搜狗输入法
  18. c语言编程题企业奖金,【C语言】企业奖金发放问题
  19. 字段是否包含中文、英文、数字
  20. 创业需要的就是“不安分”的人

热门文章

  1. 如何打赢出行下半场?百度地图祭出这四招
  2. 硬核解析Linux文件系统底层【VFS文件系统】
  3. R语言介绍及安装教程
  4. java静态变量存储空间分配
  5. 闲来无事,说说Windows剪贴板 -- 剪贴板概述部分
  6. Arduino环境下ESP32另外的下载方式(用USB转TTL连接TX0和RX0下载)
  7. Java 多线程练习 三人共抢10张票 限制黄牛党只能抢到一张票
  8. 博图V17 DB块 导入 昆仑通态屏
  9. 计算机dos批处理代码,计算机Dos批处理,编写一键清理系统垃圾的bat代码,小白都可以学-批处理删除文件...
  10. VS2010SP1安装卡在VS10Sp1-KB983509处的解决