gpt4 book ai didi

multithreading - 什么是纺 yarn ?

转载 作者:行者123 更新时间:2023-12-04 10:59:56 24 4
gpt4 key购买 nike

我在阅读 this 时偶然发现了纺纱这个词,指的是一根线。 ( active 氧)

旋转线程背后的一般概念是什么?

我的直觉会说自旋线程是在多线程进程中以一定频率不断执行的线程,这与轮询的概念有些相关(即以一定频率不断检查某些条件)但我不确定所有关于它。

你能解释一下吗?越通用越好。

最佳答案

这里有几个不同的概念。

就 ROS(您引用的链接)而言,ros::spin() 运行 ROS 回调调用程序,以便通过属于您程序的线程将未决事件传递给您的程序回调.这种调用通常不会返回;它将等待新事件准备就绪,并在它们发生时调用适当的回调。

但您还提到了“旋转线程”。

这是一个单独的主题。它通常与低级编程模式有关,线程将重复检查是否满足某些条件而不会被挂起。

等待满足某些条件的一种常见方法是只等待条件变量。在这个例子中,线程将被内核挂起,直到其他线程调用条件变量通知。收到通知后,内核将恢复线程,条件将评估为真,允许线程继续。

std::mutex m;
std::condition_variable cv;
bool ready = false;
std::unique_lock<std::mutex> lk(m);
cv.wait(lk, []{ return ready; }); /* thread suspended */

或者,旋转方法会反复检查某些条件,而不会休眠。注意:这会导致高 CPU,正确实现有一些微妙的注意事项)。

Here是一个简单自旋锁的示例(尽管请注意自旋线程可用于自旋锁以外的其他用途)。在下面的代码中,请注意 while 循环重复调用 test_and_set ... 这只是试图将标志设置为 true;这是旋转部分。

// spin until true
std::atomic_flag lock = ATOMIC_FLAG_INIT;

while (lock.test_and_set(std::memory_order_acquire)); // acquire lock
/* got the flag .. do work */
lock.clear(std::memory_order_release); // release lock

关于multithreading - 什么是纺 yarn ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58879240/

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