原子集的GCC内置是什么?

原子集的GCC内置是什么?,c,gcc,atomic,C,Gcc,Atomic,我在上看到了内置的列表。但是对于一个原子集,你是否需要使用成对的同步锁定测试集和同步锁定释放 我在电视上看到过这个例子 但是如果我使用这个例子,并且在临界区内设置原子集,那么不同变量的原子集将被不必要地序列化 感谢您对如何在我有多个原子变量的情况下创建原子集的任何意见。根据定义,需要同时使用这两个变量 同步(…) 这个内置的问题是一个完整的内存障碍。类型 同步锁定测试和设置(类型*ptr,类型值,…) 正如Intel所描述的,该内置接口不是传统的测试集 操作,而是一个原子交换操作。它写的是价值

我在上看到了内置的列表。但是对于一个原子集,你是否需要使用成对的同步锁定测试集和同步锁定释放

我在电视上看到过这个例子

但是如果我使用这个例子,并且在临界区内设置原子集,那么不同变量的原子集将被不必要地序列化


感谢您对如何在我有多个原子变量的情况下创建原子集的任何意见。

根据定义,需要同时使用这两个变量

同步(…)

这个内置的问题是一个完整的内存障碍。类型

同步锁定测试和设置(类型*ptr,类型值,…)

正如Intel所描述的,该内置接口不是传统的测试集 操作,而是一个原子交换操作。它写的是价值 输入*ptr,并返回*ptr之前的内容。许多目标 仅对此类锁提供最低限度的支持,不支持完整的 交换操作。在这种情况下,目标可能支持简化的 此处要存储的唯一有效值是 立即常数1。*ptr中实际存储的准确值为 实现定义

这个内置的不是一个完整的屏障,而是一个获取屏障。 这意味着内置项之后的引用不能移动到(或被删除) 推测到)之前的内置,但以前的内存存储可能不会 尚未全局可见,以前的内存加载可能尚未显示 满意

无效\u同步\u锁定\u释放(类型*ptr,…)

这个内置的释放 由uuu sync u lock _test和_set获取的锁。通常这意味着写作 常数0到*ptr。这个内置物不是一个完整的屏障,而是 释放屏障。这意味着所有以前的内存存储都是 全局可见,并且满足所有以前的内存加载, 但并不能阻止后续的记忆读取被推测为 在障碍物之前


我想出了这个解决办法。如果您知道更好的,请回复:

typedef struct {
    volatile int lock;  // must be initialized to 0 before 1st call to atomic64_set
    volatile long long counter;
} atomic64_t;

static inline void atomic64_set(atomic64_t *v, long long i)
{
    // see https://attractivechaos.wordpress.com/2011/10/06/multi-threaded-programming-efficiency-of-locking/
    // for an explanation of __sync_lock_test_and_set
    while (__sync_lock_test_and_set(&v->lock, 1)) { // we don't have the lock, so busy wait until
        while (v->lock);                            // it is released (i.e. lock is set to 0)
    }                                               // by the holder via __sync_lock_release()
    // critical section
    v->counter = i;
    __sync_lock_release(&v->lock);
}

您知道是否有一个单独的调用来设置值吗?由于GCC提供了诸如uuu sync_fetch_和_or()之类的操作,因此似乎应该有一个uuu sync_set操作。如果没有,你能提供一个例子,说明如何。使用_sync_synchronize()。它是否有相应的释放调用?在我能找到的几个例子中,我没有看到一个。谢谢你真的需要使用那些传统的内置设备吗?建议在新代码中避免它们。好主意。我在“c语言中的原子操作”上找到的大多数链接都是关于这些遗留内置的。内置的_原子存储可以实现我的atomic64_集函数。
typedef struct {
    volatile int lock;  // must be initialized to 0 before 1st call to atomic64_set
    volatile long long counter;
} atomic64_t;

static inline void atomic64_set(atomic64_t *v, long long i)
{
    // see https://attractivechaos.wordpress.com/2011/10/06/multi-threaded-programming-efficiency-of-locking/
    // for an explanation of __sync_lock_test_and_set
    while (__sync_lock_test_and_set(&v->lock, 1)) { // we don't have the lock, so busy wait until
        while (v->lock);                            // it is released (i.e. lock is set to 0)
    }                                               // by the holder via __sync_lock_release()
    // critical section
    v->counter = i;
    __sync_lock_release(&v->lock);
}