gpt4 book ai didi

multithreading - 原始同步原语——安全吗?

转载 作者:行者123 更新时间:2023-12-04 22:38:37 27 4
gpt4 key购买 nike

在受限设备上,我经常发现自己在 2 个 bool 值的 2 个线程之间“伪造”了锁。每个线程只能由一个线程读取,并且只能由另一个线程写入。这就是我的意思:

bool quitted = false, paused = false;
bool should_quit = false, should_pause = false;

void downloader_thread() {
quitted = false;
while(!should_quit) {
fill_buffer(bfr);
if(should_pause) {
is_paused = true;
while(should_pause) sleep(50);
is_paused = false;
}
}
quitted = true;
}

void ui_thread() {
// new Thread(downloader_thread).start();
// ...
should_pause = true;
while(!is_paused) sleep(50);
// resize buffer or something else non-thread-safe
should_pause = false;
}

当然,在 PC 上我不会这样做,但在受限设备上,它似乎在阅读 bool value 会比获得锁快得多。当然,当需要更改缓冲区时,我会权衡较慢的恢复(参见“ sleep(50)”)。

问题 - 它是完全线程安全的吗?或者在伪造这样的锁时是否有我需要注意的隐藏问题?或者我根本不应该这样做?

最佳答案

使用 bool 值在线程之间进行通信可以按您的预期工作,但确实存在两个隐藏的问题,如 this blog post by Vitaliy Liptchinsky 中所述。 :

缓存一致性

CPU 并不总是从 RAM 中获取内存值。芯片上的快速内存缓存是 CPU 设计人员用来解决 Von Neumann bottleneck 问题的技巧之一。 .在某些多 CPU 或多核架构(如 Intel 的 Itanium )上,这些 CPU 缓存不会共享或自动保持同步。换句话说,您的线程可能会看到相同内存地址的不同值 如果它们运行在不同的 CPU 上。

为避免这种情况,您需要将变量声明为 volatile ( C++ , C# , java ),或者做 explicit volatile read/writes ,或利用锁定机制。

编译器优化

如果涉及多个线程,编译器或 JITter 可能会执行不安全的优化。有关示例,请参阅链接的博客文章。同样,您必须使用 volatile 关键字或其他机制来通知您编译器。

关于multithreading - 原始同步原语——安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/782912/

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