我已经编写了一个用于保持整数的同步队列,并面临着一种奇怪的竞争条件,我似乎无法理解.
请不要发布解决方案,我知道如何修复代码并使其工作,我想知道竞争条件是什么以及为什么它没有按预期工作.请帮助我了解出了什么问题以及原因.
首先是代码的重要部分:
这假设应用程序永远不会放入缓冲区可以容纳的数量,因此不会检查当前缓冲区大小
static inline void int_queue_put_sync(struct int_queue_s * const __restrict int_queue, const long int value ) {
if (value) { // 0 values are not allowed to be put in
size_t write_offset; // holds a current copy of the array index where to put the element
for (;;) {
// retrieve up to date write_offset copy and apply power-of-two modulus
write_offset = int_queue->write_offset & int_queue->modulus;
// if that cell currently holds 0 (thus is empty)
if …Run Code Online (Sandbox Code Playgroud) 为什么std::atomic_compare_exchange及其所有兄弟姐妹都会更新通过的期望值?
我想知道除了循环中给定的简单性之外是否有任何原因,例如:是否有一个内部函数可以在一次操作中做到这一点以提高性能?
众所周知,i ++在java中不是原子的,所以我尝试编写一个程序来证明这一点.
我的想法是新增几个线程并在每个线程内部增加计数(这是Main类中的静态字段).
如果
threadNum * iteration > count,
Run Code Online (Sandbox Code Playgroud)
那么我们可以证明i ++不是原子的,但实际上我总是让它们相等.
这是我的代码:
import java.util.ArrayList;
import java.util.List;
public class ConcurrentTest{
private static int count = 0;
public static void main(String[] args) throws Exception{
List<Thread> threads = new ArrayList<>();
for(int i = 0; i<12; ++i){
threads.add(new Thread(() -> {
for(int j=0; j<1000000; ++j) {
count++;
}
}));
}
for(Thread t: threads){
t.start();
t.join();
}
System.out.println(count);
}
}
Run Code Online (Sandbox Code Playgroud)
结果是12000000.
并且无论我如何在上述程序中改变i和j, i*j === count.
我不知道这是否有用:这个程序已在JRE 6,7和8上测试过.我还没有在Java 5或更早版本中测试它.
我有一个要求,我需要在完成后发布“n”个线程的结果。为了检查所有线程是否已完成,我使用了 AtomicInteger (incrementAndGet()) 并将其值与最终变量进行比较。在进行检查之前,我将各个线程的结果写入共享对象(写入并发散列图,因为非同步数据结构 dint 似乎就足够了)。所以,我的问题是,在我的计数器通过“if”条件之前,所有线程是否会完成对共享对象的写入(并且主线程是否能够看到一致的内存)?
这是示例代码:
公共无效运行(){
//Values is a concurrent hashMap.
values.put(Thread.currentThread().getName(), Thread.currentThread().getName());
if(counter.incrementAndGet() == 5) {
//Do something
}
}
Run Code Online (Sandbox Code Playgroud) 很多时候我必须使用自定义比较函数进行排序。我可以实施它,但有时我会犯错误。如果它返回,我通常会感到困惑,true然后它会被交换吗?有人可以解释如果它返回会发生true什么以及如果它返回会false怎样?
这就是我想要做的:数组 A[] = {1,2,3,4,5} 左旋转 2:A:{3,4,5,1,2}
我们是否有一个简单而好的解决方案来做到这一点?我希望使用这个左旋转值更新数组 A 本身 - 没有额外的空间。
我尝试了各种方法,但对于各种测试用例,逻辑似乎不同,并且很难找到适合这个看似简单的任务的算法。
注意:我知道只需创建一个具有左旋转值的新数组即可轻松完成此操作。我正在尝试在输入数组本身中执行此操作。
请建议。简单的伪代码应该可以。
我试图实现我自己的自定义 SpinLock,但 SpinLock 似乎行为不当。
\n我有两个文件,main.rs并且safe.rs.
测试在 Ubuntu 22.04.3LTS 中进行,系统规格为 4GB RAM、64 位处理器、AMD\xc2\xae Pro a4-3350b APU 和 Radeon r4 显卡。
\n这是错误消息:
\nloki@loki:~/main/vs/actic/rust-nomic/spin-lock$ cargo run RUST_BACKTRACE=1\n Compiling spin-lock v0.1.0 (/home/loki/main/vs/actic/rust-nomic/spin-lock)\n Finished dev [unoptimized + debuginfo] target(s) in 0.98s\n Running `target/debug/spin-lock RUST_BACKTRACE=1`\nHello, world!\nthread 'main' panicked at 'assertion failed: `(left == right)`\n left: `9999995`,\n right: `10000000`', src/main.rs:15:5\nnote: run with `RUST_BACKTRACE=1` environment variable to display a backtrace\nRun Code Online (Sandbox Code Playgroud)\nsafe.rs:
use core::ops::{Deref,DerefMut};\nuse core::sync::atomic::{AtomicBool,Ordering::{Acquire,Release}};\nuse core::cell::UnsafeCell;\nuse core::hint::spin_loop;\n\n#[derive(Debug)]\npub struct …Run Code Online (Sandbox Code Playgroud)