2014-10-28 24 views
2

讀取自旋鎖等多任務處理的東西,我面對這個代碼:用一個參數

#include <boost/range/algorithm.hpp> 
#include <boost/atomic.hpp> 
#include <boost/thread.hpp> 
#include <iostream> 
#include <vector> 

class SpinLock 
{ 
    boost::atomic_flag flag; 
public: 
    void lock() 
    { 
     while(flag.test_and_set(boost::memory_order_acquire)) 
      ; 
    } 
    bool try_lock() 
    { 
     return !flag.test_and_set(boost::memory_order_acquire); 
    } 
    void unlock() 
    { 
     flag.clear(boost::memory_order_release); 
    } 
}; 

int main() 
{ 
    using namespace std; using namespace boost; 

    SpinLock lock; 
    vector<thread> v; 
    for(auto i = 0; i!=4; ++i) 
     v.emplace_back([&lock, i] 
     { 
      for(auto j = 0; j!=16; ++j) 
      { 
       this_thread::yield(); 
       lock_guard<SpinLock> x(lock); 
       cout << "Hello from " << i << flush << "\tj = " << j << endl; 
      } 
     }); 
    for(auto &t: v) 
     t.join(); 
} 

你能解釋爲什麼只有一個參數?

那個冒號操作符是幹什麼的?

那是什麼東西?

回答

2

這是一個基於範圍的for循環。這些是通過C++ 11引入的。你正在迭代一個容器。

其語法爲:

for (range_declaration : range_expression) loop_statement 

for循環從容器到結束的開始執行。

1

例子:

int an_array[]={1,2,3,5,6,56,34,65,3,234}; 
for(int a : an_array) 
    cout << a; 

for循環相當於:

for(int index = 0; index < sizeof(an_array)/sizeof(an_array[0]) /*10*/; ++index) 
    cout << an_array[index]; 

的支持編譯器不明白什麼vector,如果用來對付基於範圍的for循環,他們稱之爲begin和容器的end。因此,最後的循環是一樣的:基於範圍循環

for(vector<thread>::itereator t = v.begin(); t != v.end(); ++t) 
     t->join(); // Or. (*t).join() 
+0

你是否喜歡在常規的x86處理器上進行反彙編,在兩種情況下都會得到相同的結果? – Qeeet 2014-10-28 07:03:28

+1

是的。生成的二進制/程序集將是相同的。 – Ajay 2014-10-28 07:04:32

0

,你不需要知道尺寸,這意味着對所有的t在容器v中做一些事情(加入在這種情況下)。有點不同於傳統的循環

相關問題