gpt4 book ai didi

c - 普通C库中有TestAndSet(volatile int *lock)函数吗?

转载 作者:太空宇宙 更新时间:2023-11-04 01:23:43 25 4
gpt4 key购买 nike

...还是我必须自己写? (顺便说一句,我在 C 中工作)

我正在编写一个类似于维基百科上的实现:

volatile int lock = 0;

void Critical() {
while (TestAndSet(&lock) == 1);
critical section // only one process can be in this section at a time
lock = 0 // release lock when finished with the critical section
}

但我似乎找不到预构建的 TestAndSet(volatile int *lock)

它们的外观示例包括:

#define LOCKED 1
int TestAndSet(volatile int* lockPtr) {
int oldValue;
oldValue = *lockPtr;
*lockPtr = LOCKED;
return oldValue;
}

理想情况下,我想要可以在 linux 和 windows 上运行的东西。同样,我读到原子指令的执行依赖于硬件。我不确定这会起到什么作用,也不确定如何判断硬件是否支持它,然后再运行替代方案。

谢谢!

其他上下文信息:我问这个问题的原因是为了开发一组用于访问数据结构的函数(例如 add() fetch() delete() 等......)几个线程正在访问它以进行修改和实时显示某些元素。

互斥量:我投票反对互斥体(如果我的理由没有根据,请纠正我)因为关键区域不是整个哈希表,而是给定函数访问的特定成员。因此使用互斥锁会导致整个数据结构的性能瓶颈。

备选方案:促使我查看 TestAndSet() 的原因是在数据结构中的每个元素上放置一个“beingAccessed”标志更有意义。该标志将由想要访问它的函数检查,如果它为假则设置为真,然后该函数将执行它必须执行的操作,然后释放该元素而不卡住整个结构。

评论@M.M:由于@chux 和你们都提到的原因,示例实现感觉不对。对于busy wait,我的理解是在低层使用它来开发更高层的同步机制。请参阅我上面的编辑:互斥锁。volatile 不是为了确保原子性,而是为了确保在原子函数检查时每次访问该值时都加载该值,因为多个线程可以随时修改该变量。我想象/希望的原子性是由作用于相关变量的函数提供的。针对您所写内容的特定问题:您的代码说“注意:不要使用“volatile””,但您提供的标准函数原型(prototype)是 volatile,那么非 volatile 标志变量是否在原子函数中转换为 volatile?谢谢。

最佳答案

C11 包含新的 atomic library提供此功能的。查看atomic_flag_test_and_set功能;只需将 int* 替换为 atomic_flag*

您可能只想使用 mutex (mtx_*) C11 的 threads.h 中提供的函数,而不是滚动您自己的同步。

关于c - 普通C库中有TestAndSet(volatile int *lock)函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35785061/

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