gpt4 book ai didi

c++ - 在 C++ 中轮询原子变量(bool)?

转载 作者:行者123 更新时间:2023-11-27 23:53:08 25 4
gpt4 key购买 nike

我有一个修改一个原子变量 (bool) 的线程和另一个想要轮询该变量的线程。我的应用程序在 thread A 中进行了一些函数调用,并开始轮询一个特定的原子变量。 线程 B 不断读取一些外部应用程序(dbus 上的应用程序)的状态,并相应地修改一些原子变量。 Thread A 中的函数想要确保如果它返回,那么某些外部应用程序已将其状态更改为所需状态,它将通过这些原子标志获知。

我的申请详情:

线程 A 中的函数是 start_scan() 函数,它使用 dbus API 开始扫描附近的 BLE 设备。然而,即使 start scan 调用成功但外部应用程序 (org.bluez) 仍然需要一些时间来更新它的属性 (Property: Discovering ).我还定义了像 isScanning 这样的函数,它查询一些变量(我的应用程序内部)以获取外部应用程序的当前状态。每当外部应用程序的属性更新时,它都会通过 dbus 上的 PropertiesChanged 信号通知其他应用程序,是的,在我收到 之前需要一些时间(不到一秒)成功调用 start_scan 后用于扫描的 PropertiesChanged 信号。所以,我想在我从 start_scan 函数返回之前轮询我的本地原子标志(使用我自己的超时机制),这将确保是否有人在调用 start_scan< 后查询扫描状态,然后 isScanning 将返回一个有效状态。

我不能使用 condition_variable,因为我有很多函数和标志需要在 syn 中。

问题:

std::atomic<bool> scanning_;

// Thread A
void start_scan()
{
// Dbus methods call
while (scanning_ == false) { // With some timeout
// Timeout mechanism
}
}

// Thread B receving asyn signals from DBus
void propertyUpdate(std::string name, bool value)
{
if (name == "Discovering")
scanning_ = value;

...
}

当线程 A 将轮询 scanning_ 标志时,线程 B 将收到 dbus 信号以更新 scanning_ 标志。我不确定 Thread A 是否会阻塞线程 B,就好像它会不断读取标志并且我的标志是原子的一样?我想知道如果原子变量可用,等待原子变量访问的线程是如何安排的?

编辑:

我正在做这样的事情:

    void setter(bool value)
{
std::lock_guard<std::mutex lock(mutex_);
member_ = value;
}

bool getter(void)
{
std::lock_guard<std::mutex lock(mutex_);
return member_;
}

// Thread A is blocking on a class member value
while (getter() == false);

// Thread B will modify the class member when required
setter(true);

我想知道由于在公共(public)互斥锁上调度阻塞线程可能会遇到的问题。线程 A 是否有可能继续获取 mutex_ 而线程 B 将永远被阻塞。如果在线程 A 中的 getter 函数返回之后和线程 A 再次获取 mutex_ 之前未安排线程 B,则可能会发生这种情况。

最佳答案

如果您需要阻塞线程直到条件变为真(在您的情况下,scanning_ 超时),那么您应该使用 condition variables .这样,scanning_ 将只是一个普通变量,而不是原子变量,并且它将受到互斥锁的保护。

(使用原子变量进行一些线程通信是可能的,但是你不能仅仅使用原子变量让线程休眠。在你的例子中,start_scan 不断运行,占用 CPU 时间)

关于c++ - 在 C++ 中轮询原子变量(bool)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44792172/

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