GVKun编程网logo

swift – 并发队列上的`.barrier`是否应立即生效?(chia 并发 队列)

1

本文将介绍swift–并发队列上的`.barrier`是否应立即生效?的详细情况,特别是关于chia并发队列的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及

本文将介绍swift – 并发队列上的`.barrier`是否应立即生效?的详细情况,特别是关于chia 并发 队列的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于android -------- ConstraintLayout Guideline 和 Barrier(四)、Android Studio 4.1 中的 Barrier 是否有设计编辑器连接错误、Android开发 - 掌握ConstraintLayout(八)障碍线(Barrier)、ARM有几条memory barrier 的指令?分别有什么区别?的知识。

本文目录一览:

swift – 并发队列上的`.barrier`是否应立即生效?(chia 并发 队列)

swift – 并发队列上的`.barrier`是否应立即生效?(chia 并发 队列)

我不确定这是否打破了 xcode8 beta 5.看看这段代码.你认为首先应该打印“A”,还是首先打印“B”?

let q = dispatchQueue(label: "q",attributes: .concurrent)
q.async(flags: .barrier) {
  Thread.sleep(forTimeInterval: 0.25)
  print("A")
}
q.sync {
  print("B")
}

由于.barrier,我认为它应该阻止并发队列并打印“A”,“B”,但它不在最新的xcode beta中.

错误?对.barrier的误解?你怎么看?

请注意:我知道如果我使用串行队列,这将以预期的顺序打印 – 这是一个更大的系统的一小部分,我需要孤立地理解这种行为.

解决方法

这是测试版6中修复的错误.

在beta 5中,它不仅没有按照你期望的方式运行,而且.onQueueAsBarrier前置条件也失败了.该问题似乎与.barrier选项异步,因为如果你通过等效的Objective-C API,dispatch_barrier_async执行它,它工作正常,例如:

let q = dispatchQueue(label: "q",attributes: .concurrent)

BarrierExperiment.dispatchBarrierAsync(q) {
    dispatchPrecondition(condition: .onQueueAsBarrier(q))
    Thread.sleep(forTimeInterval: 0.25)
    print("A")
}

q.async() {
    print("B")
}

哪里

@interface BarrierExperiment : NSObject

+ (void)dispatchBarrierAsync:(dispatch_queue_t)queue block:(void (^)())block;

@end

@implementation BarrierExperiment

+ (void)dispatchBarrierAsync:(dispatch_queue_t)queue block:(void (^)())block {
    dispatch_barrier_async(queue,block);
}

@end

android -------- ConstraintLayout Guideline 和 Barrier(四)

android -------- ConstraintLayout Guideline 和 Barrier(四)

前面的文章

ConstraintLayout 介绍 (一)

ConstraintLayout 约束属性 (二)

ConstraintLayout 宽高比和偏移量比(三)

此博文主要讲解:Guideline 和 Barrier

Guideline (了解,实际使用过程中我使用的不多)

当需要一个任意位置的锚点时,可以使用指示线(Guideline)来帮助定位,指示线实际上是 View 的子类,使用方式和普通的 View 相同,但指示线有着如下的特殊属性:

  • 宽度和高度均为 0
  • 可见性为 View.GONE

案例:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <!--重要的是Guideline是不会显示到界面上的,默认是GONE的。-->


   <android.support.constraint.Guideline
        android:id="@+id/guidelineBegin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_begin="100dp" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        android:text="Button"
        app:layout_constraintLeft_toLeftOf="@+id/guidelineBegin"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.constraint.Guideline
        android:id="@+id/guidelineEnd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_end="100dp" />

    <Button
        android:id="@+id/buttonEnd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="Button2"
        app:layout_constraintRight_toLeftOf="@+id/guidelineEnd"
        app:layout_constraintTop_toTopOf="parent" />

    <android.support.constraint.Guideline
        android:id="@+id/guidelinePercent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.8" />

    <Button
        android:id="@+id/buttonPercent"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="96dp"
        android:text="Button3"
        app:layout_constraintLeft_toLeftOf="@+id/guidelinePercent"
        app:layout_constraintTop_toTopOf="parent" />

    <!--当你要用一个控件占屏幕宽度的一半的时候,可以用layout_constraintGuide_percent -->

</android.support.constraint.ConstraintLayout>

 

如图:(有三个指示线)

         

 

Barrier

直译为障碍、屏障。在约束布局中,可以使用属性 constraint_referenced_ids 属性来引用多个带约束的组件,

从而将它们看作一个整体,Barrier 的介入可以完成很多其他布局不能完成的功能;

它跟 Guideline  一样属于 Virtual Helper objects,在运行时的界面上看不到,但是要比 Guideline 实用多了。

 

案例

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">



    <!--Barrier-->

    <!-- 原始方案: 当改变textView1 的字段内容时,textView3随之改变,
                   当改变textView2 的字段内容时,则失效
        -->

<TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="16dp" android:text="warehouse" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:text="hospita" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/textView1" /> <!--现在 Barrier 就已经定义好了,只剩下把textView3的约束从相对于 textView1 改为 相对于 Barrier 了: app:layout_constraintLeft_toRightOf="@+id/textView1" ===> 不设置下面属性则会出现有的内容看不见 取消下面注释 app:layout_constraintLeft_toRightOf="@+id/barrier1"/ app:layout_constraintStart_toEndOf="@+id/barrier1" --> <android.support.constraint.Barrier android:id="@+id/barrier1" android:layout_width="wrap_content" android:layout_height="wrap_content" app:barrierDirection="end" app:constraint_referenced_ids="textView1,textView2" /> <TextView android:id="@+id/textView3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="16dp" android:layout_marginRight="10dp" android:text="为了看到整体的效果,可以切换语言,此时你会看到Barrier会自动位于较宽的那个textView后面,也就间接让 textView3 也位于了正确的位置:" app:layout_constraintLeft_toRightOf="@+id/barrier1" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <!-- <android.support.constraint.Barrier android:id="@+id/barrier7" android:layout_width="wrap_content" android:layout_height="wrap_content" app:barrierDirection="end" app:constraint_referenced_ids="textView2,textView1" /> <TextView android:id="@+id/textView3" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="8dp" android:layout_marginTop="16dp" android:text="为了看到整体的效果,可以切换语言,此时你会看到 Barrier 会自动位于较宽的那个 textView 后面,也就间接让 textView3 也位于了正确的位置:" app:layout_constraintStart_toEndOf="@+id/barrier7" app:layout_constraintTop_toTopOf="parent" />--> </android.support.constraint.ConstraintLayout>

 

效果图:(你可以随便改变 textview1 和 textview2 的长度,并不会影响 textview3 的显示)

            

 

 

很实用

 

参考地址:https://constraintlayout.com/basics/barriers.html

 

Android Studio 4.1 中的 Barrier 是否有设计编辑器连接错误

Android Studio 4.1 中的 Barrier 是否有设计编辑器连接错误

如何解决Android Studio 4.1 中的 Barrier 是否有设计编辑器连接错误?

我正在使用 Android Studio 4.1,但在使用 Barrier 时遇到了问题。我添加了一个按钮、一个屏障和一个文本元素。然后我将 button 拖到评论树中的 barrier 上。在这一点上,我尝试创建从 text 元素barrier 的约束,但该约束无法识别 barrier。我可以在 XML 中手动创建链接,但希望能够在设计编辑器中执行此操作

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Android开发 - 掌握ConstraintLayout(八)障碍线(Barrier)

Android开发 - 掌握ConstraintLayout(八)障碍线(Barrier)

本文我们来介绍障碍线(Barrier)的使用,平常在开发中用的相对要少一些,但是在需要时会非常方便。

它的作用是将多个元素放到这个障碍线里面使时,其中的任何元素的大小或位置变化时都会使它的位置进行改变。

可以理解成一面墙,"墙"里面任何元素的位置或大小改变时都会导致它的改变,从而保证所有的元素都在"墙"里面。

下面我们来举例进行说明,会更加直观。

  1. 首先,我们先创建两个元素:

  1. 接下来,我们来创建一条垂直的Barrier:

  1. 创建后,我们把这两个View拖到这个Barrier里面:

注意:这里将View拖进去并不是真正创建了层级关系,我们看代码可以知道,仅仅这个Barrier引用了两个View的ID:

<android.support.constraint.Barrier
        android:id="@+id/barrier"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:barrierDirection="left"
        app:constraint_referenced_ids="button,textView"
        tools:layout_editor_absoluteX="104dp" />
  1. 默认的Barrier是在所有元素的左面,我们选中它后可以选择靠右对齐:

创建完成后我们来调整其里面的各个View的大小和位置就可以理解它的作用了:


总结

Barrier特别在复杂的页面布局的时候非常有用,不需要创建一个容器来放置这些子View来实现这样的功能了,这也是我们使用ConstraintLayout的初衷,保证层级的简单和高效。

下一篇:Android开发 - 掌握ConstraintLayout(九)分组(Group),我们将介绍分组(Group)的使用。

如有更多疑问,请参考我的其它Android相关博客:我的博客地址

ARM有几条memory barrier 的指令?分别有什么区别?

ARM有几条memory barrier 的指令?分别有什么区别?

从ARMv7指令集开始,ARM提供3条内存屏障指令。

(1)数据存储屏障( Data Memory Barrier,DMB) 数据存储器隔离。DMB指令保证:仅当所有在它前面的存储器访问操作都执行完毕后,才提交( commit)在它后面的存取访问操作指令。当位于此指令前的所有内存访问均完成时,DMB指令才会完成

(2)数据同步屏障( Data synchronization Barrier,DSB) 数据同步隔离。比DMB要严格一些,仅当所有在它前面的存储访问操作指令都执行完毕后,才会执行在它后面的指令,即任何指令都要等待DSB前面的存储访问完成。位于此指令前的所有缓存,如分支预测和TLB( Translation Look- aside Buffer)维护操作全部完成

(3)指令同步屏障( Instruction synchronization Barrier,ISB) 指令同步隔离。它最严格,冲洗流水线( Flush Pipeline)和预取buer( pretcLbuffers后,才会从 cache或者内存中预取ISB指令之后的指令。ISB通常用来保证上下文切换的效果,例如更改ASID( Address Space Identifier)、TLB维护操作和C15寄存器的修改等。

内存屏障指令的使用例子如下。 例1:假设有两个CPU核A和B,同时访问 AddrE和Addr2地址。

Core A:
STR R0, [Addr1]
LDR R1, [Addr2]
Core B: STR R2, [Addr2]
LDR R3, [Addr1]

对于上面代码片段,没有任何的同步措施。对于 Core A、寄存器R1、 Core B和寄存器R3,可能得到如下4种不同的结果。

  • A得到旧的值,B也得到旧的值。
  • A得到旧的值,B得到新的值。
  • A得到新的值,B得到旧的值。
  • A得到新的值,B得到新的值。

例2:假设 Core a写入新数据到Msg地址, Core B需要判断flag标志后才读入新数据。

Core A
STR R0,[Msg] @写新数据到Msg地址
STR R1,[F1ag] @F1ag标志新数据可以读 Core B
Poll loop:
LDR R1, [Flag]
CMP R1, #0 @判断flag有没有置位
BEQ Poll loop
LDRR0,[Msg] @读取新数据

在STR 存储指令之后插入DSB指令,强制让写命令完成,然后执行读取flag的判断循环;

今天的关于swift – 并发队列上的`.barrier`是否应立即生效?chia 并发 队列的分享已经结束,谢谢您的关注,如果想了解更多关于android -------- ConstraintLayout Guideline 和 Barrier(四)、Android Studio 4.1 中的 Barrier 是否有设计编辑器连接错误、Android开发 - 掌握ConstraintLayout(八)障碍线(Barrier)、ARM有几条memory barrier 的指令?分别有什么区别?的相关知识,请在本站进行查询。

本文标签: