什么是纺纱线?
What is a Spinning Thread?
我在阅读 this (ROS)
时偶然发现了旋转这个词,指的是线程
旋转线程背后的一般概念是什么?
我的直觉会说自旋线程是在多线程进程中以一定频率持续执行的线程,这与轮询的概念有些相关(即以一定频率持续检查某些条件),但我不是完全确定。
你能解释一下吗?越通用越好。
这里有几个不同的概念。
就 ROS(您引用的 link)而言,ros::spin()
运行 ROS 回调调用程序,以便通过属于您程序的线程将未决事件传递给您的程序回调。这种调用通常不会 return;它将等待新事件准备就绪,并在它们发生时调用适当的回调。
但是你也参考了"spinning a thread."
这是一个单独的主题。它通常与低级编程模式有关,线程将重复检查是否满足某些条件而不会被挂起。
等待满足某些条件的一种常见方法是只等待条件变量。在这个例子中,线程将被内核挂起,直到其他线程调用条件变量通知。通知后,内核将恢复线程,条件将评估为真,允许线程继续。
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 部分。
// 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
像 while 循环一样旋转而不休眠,您的任务会不断消耗 cpu 资源,直到满足条件。
我在阅读 this (ROS)
时偶然发现了旋转这个词,指的是线程旋转线程背后的一般概念是什么?
我的直觉会说自旋线程是在多线程进程中以一定频率持续执行的线程,这与轮询的概念有些相关(即以一定频率持续检查某些条件),但我不是完全确定。
你能解释一下吗?越通用越好。
这里有几个不同的概念。
就 ROS(您引用的 link)而言,ros::spin()
运行 ROS 回调调用程序,以便通过属于您程序的线程将未决事件传递给您的程序回调。这种调用通常不会 return;它将等待新事件准备就绪,并在它们发生时调用适当的回调。
但是你也参考了"spinning a thread."
这是一个单独的主题。它通常与低级编程模式有关,线程将重复检查是否满足某些条件而不会被挂起。
等待满足某些条件的一种常见方法是只等待条件变量。在这个例子中,线程将被内核挂起,直到其他线程调用条件变量通知。通知后,内核将恢复线程,条件将评估为真,允许线程继续。
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 部分。
// 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
像 while 循环一样旋转而不休眠,您的任务会不断消耗 cpu 资源,直到满足条件。