簡體   English   中英

什么是紡線?

[英]What is a Spinning Thread?

我偶然發現了旋轉這個詞,在閱讀 本文時指的是一個線程(ROS)

旋轉線程背后的一般概念是什么?

我的直覺會說,旋轉線程是一個在多線程進程中以一定頻率持續執行的線程,這與輪詢的概念有些相關(即以一定頻率不斷檢查某些條件),但我對此完全不確定.

你能解釋一下嗎? 越通用越好。

這里有幾個單獨的概念。

就 ROS(您引用的鏈接)而言, ros::spin()運行 ROS 回調調用程序,以便通過屬於您的程序的線程將掛起的事件傳遞給您的程序回調。 這種調用通常不會返回; 它將等待新事件准備好,並在它們發生時調用適當的回調。

但是您也指“旋轉線程”。

這是一個單獨的主題。 它通常與低級編程模式有關,其中線程將重復檢查是否滿足某些條件而不會被掛起。

等待滿足某些條件的一種常見方法是僅等待條件變量。 在這個例子中,線程將被 kernel 掛起,直到其他線程調用通知條件變量。 收到通知后,kernel 將恢復線程,條件將評估為真,允許線程繼續。

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

在沒有睡眠的情況下像 while 循環一樣旋轉,您的任務會不斷消耗 cpu 資源,直到滿足條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM