- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
...还是我必须自己写? (顺便说一句,我在 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/
Silberschatz、Galvin 和 Gagne 所著的《操作系统原理》一书在同步章节中包含以下 TestAndSet() 指令的定义: boolean TestAndSet(boolean *
我有一个消费者线程,它必须不锁定 从缓冲区中读取。如果因为生产者线程正在写入缓冲区而必须跳过该操作,那也没关系。因此,在我看来最合适的选择是在某些标志上使用原子 TestAndSet。 现在,前面提到
请考虑以下 CompareAndSwap 代码,让我知道为什么这个原子指令比原子 TestAndSet 更强大,因为它是一个互斥原语? char CompareAndSwap(int *ptr, in
我是一名优秀的程序员,十分优秀!