gpt4 book ai didi

c - 关于 c struct (gcc) 问题的原子加载/保存

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:27 26 4
gpt4 key购买 nike

试试我的运气来实现无锁单链表。

typedef _Atomic struct _node
{
void *data;
struct _node *next;
} Node;

这是否也使具有 _Atomic 的结构的所有成员都成为原子?

void add_head ( Linked_list* list, void* data )
{
if ( debugging )
{
printf ( "%s\n", __func__ );
}
Node *node = ( Node* ) calloc ( 1, sizeof (Node ) );
//init_node_mutex(node);
//lock_node_mutex(node);
atomic_exchange ( &node->next, NULL );
atomic_exchange ( &node->data, data );

if ( list->head == NULL )
{
Node* the_tail = atomic_load ( &list->tail );
// lock_node_mutex ( the_tail );
atomic_exchange ( &node->next, NULL );
atomic_compare_exchange_weak ( &list->tail, the_tail, node );

//unlock_node_mutex ( the_tail );

}
else
{

Node* the_next = atomic_load ( &node->next );
// lock_node_mutex ( the_next );
atomic_compare_exchange_weak ( &node->next, the_next, list->head );
// unlock_node_mutex ( the_next );
}

Node* the_head = atomic_load ( & list->head );
//lock_node_mutex ( the_head );
atomic_store ( &list->head, node );
atomic_store ( &list->current, node );
//unlock_node_mutex ( the_head );
//unlock_node_mutex(node);
atomic_fetch_add ( &list->size, 1 );
}

atomic_load 和 atomic_store 的用法是否正确?

最佳答案

好吧,我考虑过是将其发布为“评论”还是“回答”,但我打算在这里孤注一掷。

我的直觉告诉我“你正在执行的单个操作是否是“原子的”真的无关紧要,因为你正在连续执行许多操作以完成您最终要尝试做的事情。即使这些单独的步骤是“原子的”,整个操作也不是。

“原子”操作是使用专用机器指令的操作,例如 x86 上的 LOCK 前缀或 big- 上的“compare-and-swap”指令iron,执行单个操作,这样其他CPU(或核心)将不会干扰该单个操作。

但是,无论是否是原子的,您都无法在“一条指令”中完成您想做的事情。

因此,我诚挚地建议您现在放弃您目前的类(class),将那些“互斥”调用放回去,并删除“原子”。您的代码(以及所有此类代码...)需要这些互斥量。在我看来,您是在追逐一只白兔进入死胡同。

(顺便说一下,“互斥”操作有时会很好地利用这些“原子指令”,因此它们的效率可能比您担心的要高得多。)

关于c - 关于 c struct (gcc) 问题的原子加载/保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38317513/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com