标签: compare-and-swap

具有比较和交换的int队列具有竞争条件

我已经编写了一个用于保持整数的同步队列,并面临着一种奇怪的竞争条件,我似乎无法理解.

不要发布解决方案,我知道如何修复代码并使其工作,我想知道竞争条件是什么以及为什么它没有按预期工作.请帮助我了解出了什么问题以及原因.

首先是代码的重要部分:

这假设应用程序永远不会放入缓冲区可以容纳的数量,因此不会检查当前缓冲区大小

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)

c race-condition compare-and-swap

1
推荐指数
1
解决办法
346
查看次数

为什么std :: atomic_compare_exchange会更新预期值?

为什么std::atomic_compare_exchange及其所有兄弟姐妹都会更新通过的期望值?

我想知道除了循环中给定的简单性之外是否有任何原因,例如:是否有一个内部函数可以在一次操作中做到这一点以提高性能?

c++ multithreading atomic compare-and-swap c++11

1
推荐指数
1
解决办法
408
查看次数

如何证明i ++不是原子的

众所周知,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或更早版本中测试它.

java multithreading compare-and-swap

1
推荐指数
1
解决办法
81
查看次数

原子变量是否保证“在关系之前发生”?

我有一个要求,我需要在完成后发布“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)

java concurrency java-memory-model compare-and-swap

0
推荐指数
1
解决办法
751
查看次数

std::sort() C++ 的自定义比较函数

很多时候我必须使用自定义比较函数进行排序。我可以实施它,但有时我会犯错误。如果它返回,我通常会感到困惑,true然后它会被交换吗?有人可以解释如果它返回会发生true什么以及如果它返回会false怎样?

c++ sorting std compare-and-swap

-1
推荐指数
1
解决办法
955
查看次数

左旋转数组 C++

这就是我想要做的:数组 A[] = {1,2,3,4,5} 左旋转 2:A:{3,4,5,1,2}

我们是否有一个简单而好的解决方案来做到这一点?我希望使用这个左旋转值更新数组 A 本身 - 没有额外的空间。

我尝试了各种方法,但对于各种测试用例,逻辑似乎不同,并且很难找到适合这个看似简单的任务的算法。

注意:我知道只需创建一个具有左旋转值的新数组即可轻松完成此操作。我正在尝试在输入数组本身中执行此操作。

请建议。简单的伪代码应该可以。

c++ arrays algorithm compare-and-swap

-2
推荐指数
2
解决办法
2589
查看次数

如何实现自旋锁

我试图实现我自己的自定义 SpinLock,但 SpinLock 似乎行为不当。

\n

我有两个文件,main.rs并且safe.rs.

\n

测试在 Ubuntu 22.04.3LTS 中进行,系统规格为 4GB RAM、64 位处理器、AMD\xc2\xae Pro a4-3350b APU 和 Radeon r4 显卡。

\n

这是错误消息:

\n
loki@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\n
Run Code Online (Sandbox Code Playgroud)\n

safe.rs:

\n
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)

concurrency spinlock compare-and-swap rust

-4
推荐指数
1
解决办法
112
查看次数