2

我偶然发现了旋转这个词,在阅读本文时指的是一个线程(ROS)

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

我的直觉会说,自旋线程是一个在多线程进程中以一定频率持续执行的线程,这与轮询的概念有些相关(即以一定频率不断检查某些条件),但我对此完全不确定.

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

4

2 回答 2

3

这里有几个单独的概念。

就 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,并且正确实施有一些细微的警告)。

是一个简单的自旋锁的示例(尽管请注意,自旋线程可以用于自旋锁以外的其他目的)。在下面的代码中,请注意 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
于 2019-11-15T15:06:29.523 回答
-1

在没有睡眠的情况下像 while 循环一样旋转,您的任务会不断消耗 cpu 资源,直到满足条件。

于 2019-11-15T20:53:33.200 回答