- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我对以下代码示例有疑问(m_value 不是可变的,每个线程都在单独的处理器上运行)
void Foo() // executed by thread #1, BEFORE Bar() is executed
{
Interlocked.Exchange(ref m_value, 1);
}
bool Bar() // executed by thread #2, AFTER Foo() is executed
{
return m_value == 1;
}
在 Foo() 中使用 Interlocked.Exchange 是否保证在执行 Bar() 时,我会看到值“1”? (即使该值已经存在于寄存器或缓存行中?)还是我需要在读取 m_value 的值之前放置一个内存屏障?
此外(与原始问题无关),声明一个 volatile 成员并通过引用传递给 InterlockedXX 方法是否合法? (编译器警告通过引用传递 volatiles,所以在这种情况下我应该忽略警告吗?)
请注意,我不是在寻找“更好的做事方式”,所以请不要发布建议完全替代做事方式的答案(“改用锁”等.), 这个问题纯粹出于兴趣..
最佳答案
内存障碍对你没有特别的帮助。它们指定内存操作之间的顺序,在这种情况下,每个线程只有一个内存操作,因此无关紧要。一个典型的场景是非原子地写入结构中的字段,内存屏障,然后将结构的地址发布给其他线程。 Barrier 确保所有 CPU 在获取结构成员的地址之前都能看到对结构成员的写入。
您真正需要的是原子操作,即。 InterlockedXXX 函数,或 C# 中的可变变量。如果 Bar 中的读取是原子的,则可以保证编译器和 cpu 都不会进行任何优化,以防止它在写入 Foo 之前或写入 Foo 之后读取值,具体取决于先执行哪个。由于您是说您“知道”Foo 的写入发生在 Bar 的读取之前,因此 Bar 将始终返回 true。
如果 Bar 中的读取不是原子的,它可能正在读取部分更新的值(即垃圾)或缓存值(来自编译器或来自 CPU),这两者都可能阻止 Bar 返回 true,这它应该。
大多数现代 CPU 保证字对齐读取是原子的,所以真正的技巧是你必须告诉编译器读取是原子的。
关于c# - 互锁和内存屏障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1757942/
我有一个使用临界区的 Windows DLL(C 语言)。多次调用的特定例程需要在第一次调用时执行一些初始化代码,因此我使用了临界区。但是,由于它被调用了很多次,我试图避免每次调用时都进入该部分的开销
我想确保正确实现障碍。现在,每次调用 amStaticThreaded 时都会启动大量新线程。在我的主例程中,amStaticThreaded 之后的所有事情都只能由一个线程完成,但那部分速度非常快。
我想实现自定义 Java 屏障。我不想使用 CyclicBarrier class . 所以所有线程都在一个公共(public)点相遇。只有当所有线程都到达屏障时,线程才会继续。 我想使用 wait/
您好,很抱歉发布了一大堆代码,但我对 C 代码还很陌生,基本上我正在做一项大学作业,我必须实现一个“pthread_barrier”,现在我理解了屏障的概念(或者至少我认为我这样做)但我只是不确定我应
什么是boost:barrier,如何使用这种boost方法。你能不能给我一个清楚的例子,因为我找到了下面的例子: bool wait() { boost::mutex
我正在尝试在 cython 中使用 openmp。我需要在 cython 中做两件事: i) 在我的 cython 代码中使用 #pragma omp single{} 作用域。 ii) 使用#pra
所以这是代码: #pragma omp parallel private (myId) { set_affinity(); myId = omp_get_thread_num(); if
我正在尝试在 cython 中使用 openmp。我需要在 cython 中做两件事: i) 在我的 cython 代码中使用 #pragma omp single{} 作用域。 ii) 使用#pra
我正在尝试创建一个 C 代码来对具有多个线程的数组进行排序,因此我需要使用屏障来同步威胁 void sort(struct ThreadArguments* args){ struct
这些天我正在阅读有关内存栅栏和屏障的内容,作为同步多线程代码和避免代码重新排序的一种方法。 我通常在 Linux 操作系统下使用 C++ 进行开发,并且大量使用 boost 库,但我找不到任何与之相关
我正在编写一个 SMT 程序,并且正在尝试解决一个有趣的问题。 我需要所有函数一起退出,但是有些线程卡在障碍物上,即使我不希望它们这样做。 我的问题是:当我删除障碍时会发生什么?卡在屏障处的线程会释放
可能是我没有理解线程的屏障概念。但是我写了一段代码,我想了解它是否正确使用了 barrier。 代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*-
我想编写可移植代码(Intel、ARM、PowerPC...)来解决一个经典问题的变体: Initially: X=Y=0 Thread A: X=1 if(!Y){ do something
我有一个 n 的二维网格x n元素。在一次迭代中,我通过平均相邻元素的值来计算一个元素的值。即: for(int i=0;i
我是 MPI 新手,在尝试使用障碍时遇到了 fatal error 。我有一个简单的 for 循环,它以循环方式将索引分配给每个进程,紧随其后的是 MPI 屏障: mpi.cc #include #
我正在使用 gdrive和 gshell为了与我的 Google 帐户交互并下载文件,请获取他们的信息。 当我运行时:gdrive about或 gdown about ,我收到以下消息 Initia
运行以下代码时,2个启动线程将被CyclicBarrier *对象锁定,并无限等待第三个线程解锁 import java.util.concurrent.BrokenBarrierException;
我是一名优秀的程序员,十分优秀!