- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
请查看以下使用 OpenMP 进行并行化的代码片段:
char lock = 0;
#pragma omp parallel
{
while(!__sync_bool_compare_and_swap(&lock, 0, 1));
printf("Thread: %d is working!\n", omp_get_thread_num());
sleep(1);
printf("Thread: %d unlocks lock!\n", omp_get_thread_num());
lock = 0;
}
是否有可能线程同时锁定锁,即使锁定是原子的,使用 __sync_bool_compare_and_swap?例如,并非所有线程都具有一致的内存 View ?
最佳答案
如果您坚持不以 OpenMP 方式执行此操作:
你肯定需要一个编译器屏障来防止 lock=0
成为 reordered at compile time .
如果您只针对 x86,那么只需要一个编译器屏障就可以了;否则使用 C11 atomic_thread_fence(memory_order_release)
在 lock=0
之前,这只是 x86 上的编译器障碍,但会在弱序架构上发出必要的指令。
或者使 lock
成为原子类型,并使用 C11 stdatomic release-store 将其设置为 0。
在 lock cmpxchg
上自旋来获取锁是非常低效的。您应该在负载上旋转直到锁定可用,然后尝试承受它。例如你应该写一些可以编译成代码的东西 like this minimal but real asm spinlock implementation.
例如使用带有 memory_order_acquire
的 C11 原子加载。然后使用普通的 xchg
,而不是 cmpxchg
,并检查您是否获得了锁,或者是否有其他线程在您之前获得了它。
关于c - 使用编译器内部函数实现自旋锁以同步 OpenMP 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37994579/
我试图让我的 SCNNode 自动水平旋转。这是我到目前为止的代码: box.scale = SCNVector3(x: 0.26, y: 0.26, z: 0.26) box.position =
我试图让我的 SCNNode 自动水平旋转。这是我到目前为止的代码: box.scale = SCNVector3(x: 0.26, y: 0.26, z: 0.26) box.position =
我试图让 unicode 三 Angular 形 (▵) 在页面加载时和用户将鼠标悬停在跨度上时旋转 360 度。我已经设置了一个 jsFiddle解释我想要什么。 ULTR▵ 我对 CS
我是一名优秀的程序员,十分优秀!