2013-10-10 171 views
3

剛(一般和多線程)開始強制多線程的線程之間的比賽,並和寫的代碼短小文檔片斷。使用使用C++ 11線程庫C++ 11個線程

#include <iostream> 
#include <thread> 

int x = 5; //variable to be effected by race 

    //This function will be called from a thread 
    void call_from_thread1() { 
    for (int i = 0; i < 5; i++) { 
      x++; 
      std::cout << "In Thread 1 :" << x << std::endl; 
     } 
    }  

    int main() { 
     //Launch a thread 
     std::thread t1(call_from_thread1); 

     for (int j = 0; j < 5; j++) { 
      x--; 
      std::cout << "In Thread 0 :" << x << std::endl; 
     } 

     //Join the thread with the main thread 
     t1.join(); 

    std::cout << x << std::endl; 
    return 0; 
    } 

因爲兩個線程之間的競爭,每次(或幾乎每次)都會得到不同的結果。但是,輸出始終爲:0,即兩個線程按順序運行。爲什麼我會得到相同的結果,並且有什麼方法來模擬或強制兩個線程之間的競賽?

+2

這就是爲什麼比賽條件總是* *未定義行爲。 ;) –

+0

你的CPU有多少核心? – DeathByTensors

+0

4核,酷睿i3 – newprint

回答

8

你的樣本量是相當小的,並且在不斷刷新標準輸出有點自我攤位。總之,你需要一個更大的錘子。

如果你想在行動中看到一個真實的競爭條件,考慮以下。我故意添加了一個原子和非原子計數器,發送到樣本的線程。一些試運行結果的代碼之後公佈:從上面的代碼

#include <iostream> 
#include <atomic> 
#include <thread> 
#include <vector> 

void racer(std::atomic_int& cnt, int& val) 
{ 
    for (int i=0;i<1000000; ++i) 
    { 
     ++val; 
     ++cnt; 
    } 
} 

int main(int argc, char *argv[]) 
{ 
    unsigned int N = std::thread::hardware_concurrency(); 
    std::atomic_int cnt = ATOMIC_VAR_INIT(0); 
    int val = 0; 

    std::vector<std::thread> thrds; 
    std::generate_n(std::back_inserter(thrds), N, 
     [&cnt,&val](){ return std::thread(racer, std::ref(cnt), std::ref(val));}); 

    std::for_each(thrds.begin(), thrds.end(), 
     [](std::thread& thrd){ thrd.join();}); 

    std::cout << "cnt = " << cnt << std::endl; 
    std::cout << "val = " << val << std::endl; 
    return 0; 
} 

一些樣品運行:

cnt = 4000000 
val = 1871016 

cnt = 4000000 
val = 1914659 

cnt = 4000000 
val = 2197354 

注意原子計數器是準確的(我在Core Duo的運行帶有超線程的i7 macbook air laptop,所以4個線程,因此4百萬)。對於非原子計數器也不能這麼說。

3

將有顯著啓動開銷獲得第二個線程去,所以第一個線程完成for循環,它通過比較將採取幾乎沒有時間之後,其執行將幾乎總是開始。要查看競爭條件,您需要運行花費更長時間的計算,或者包括需要花費大量時間的I/O或其他操作,以便兩個計算的執行實際上重疊。

+0

酷,謝謝你解釋! – newprint