嵌入式系统中具有CAS(atomic_comapre_and_set)的线程安全

时间:2018-11-26 03:23:10

标签: multithreading thread-safety cas

我正在尝试使用CAS在嵌入式系统中执行线程安全。 不幸的是,它无法正常工作。

说有一个全局数组,几个线程将访问它。

typedef struct{
    int in_use;
    data_type data;
} item_type;
item_type global_array[N]

这个想法是:线程可以使用global_array中由“ in_use”标志指示的可用项。实现如下:

item_type* get_available_item_pointer(void){
    int available_index = N;
    for (int i=0; i<N; i++){
        if (atomic_compare_and_set(&(global_array[index].in_use), FALSE, TRUE))
        {
         available_index = i;
         break;
        }
    }
    return &(global_array[index]);
}
void free_item_pointer(item_type* item_ptr){
    if (item_ptr->in_use){
        memset(&item_ptr->data, 0x0, sizeof(data_type));
        item_ptr->in_use = FALSE;    //should I use atomic function for this line?
    }
}

在糟糕的情况下,我发现有2个线程碰巧访问了同一项目并且发生了数据损坏,我不知道为什么可能这样?

thread A is calling get_available_item_pointer() //return index 0
thread B is calling free_item_pointer()  //freeing index 0

顺便说一句,atomic_compare_and_set实现类似于:

static inline int atomic_compare_and_set(
                   unsigned int* target,
                   unsigned int old_val,
                   unsigned int new_val)
{
unsigned int current_val;
__asm__ __volatile__(
    ......
return current_val == old_val;
}

0 个答案:

没有答案