我正在尝试使用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;
}