如何实施TAS(“测试和设置”)?

问题描述 投票:0回答:3

有人知道TAS的实施吗?

此代码以后应该能够保护代码在获取和释放基于多线程的状态丢失之间。

typedef volatile long lock_t;

void acquire(lock_t* lock){
    while(TAS(lock))
        ;
}

void release(lock_t* lock){
    *lock = 0;
}

lock_t REQ_lock = 0;

int main(){
    acquire(&REQ_lock);
    //not Atomar Code
    release(&REQ_lock);
}
c multithreading interrupt interrupt-handling
3个回答
1
投票

C11标准将原子类型带入了语言。

其中有atomic_flag类型,它具有关联的功能atomic_flag_test_and_set这是来自标准的:

C11工作草案第7.17.8.1节:

简介

#include <stdatomic.h>
_Bool atomic_flag_test_and_set(
    volatile atomic_flag *object);
_Bool atomic_flag_test_and_set_explicit(
    volatile atomic_flag *object,memory_order order);

说明

以原子方式设置由指向的值宾语真实。记忆受到影响的价值订购。这些操作是原子的读-修改-写操作

返回

从原子上说,就是紧接在效果之前的对象的值。

以及它,您需要它的姊妹操作atomic_flag_clear

第7.17.8.2节:

简介

#include <stdatomic.h>
void atomic_flag_clear(volatile atomic_flag *object);
void atomic_flag_clear_explicit(
    volatile atomic_flag *object, memory_order order);

说明

顺序参数不得为memory_order_acquire或memory_order_acq_rel。以原子方式将对象指向的值设置为false。内存会受到命令值的影响。

返回

atomic_flag_clear函数不返回任何值


-1
投票

确定,这应该可以。它适用于大多数32-CPU

#define TAS(lock) __sync_lock_test_and_set(lock, 1)

-3
投票

是的,不。 C的优点之一是使您尽可能地接近机器语言的边界,但没有更多。这是更进一步。

您可以寻求原子支持,这在某些C扩充标准中提供,但是有很多问题。

在组装中编写TAS。限制用于TAS(包含)的变量的可见性。对于任何给定的体系结构,它只应包含少量的装配线。您的程序将包含它的依赖关系,并且缺少包含是C增强的最近十年中的关键缺陷之一。

© www.soinside.com 2019 - 2024. All rights reserved.