2012-07-20 67 views
0

我想在同時寫入條件下模擬stl map的異常行爲。 這裏我使用了一個映射,並同時從多個線程插入數據。 由於我們只使用一個地圖對象,因此它不應該允許。 請通過下面的示例代碼stl map同時寫入示例代碼

#include <iostream> 
    #include <map> 
    #include <iterator> 
    #include <algorithm> 

    extern "C" 
    { 
    #include <pthread.h> 
    #include <string.h> 
    #include <stdlib.h> 
    } 

    using namespace std; 

//functor to print map 
    struct PrintMp 
    { 
     void operator()(pair<int,int> pr) 
     { 
      cout<<pr.first<<" => "<<pr.second<<endl; 
     } 
    }; 
//thread 1 
//inserts continuous no from 0 to 4999  
    void* ins_th1(void *arg) 
    { 
     map<int, int> *mp = static_cast<map<int, int>* >(arg); 
     for(int i =0 ; i<5000; i++) 
      mp->insert(pair<int,int>(i, i+1000)); 

     return NULL; 
    } 

//thread 1 
//inserts continuous no from 0 to 4999  
    void* ins_th2(void *arg) 
    { 
     map<int, int> *mp = static_cast<map<int,int>* >(arg); 
     for(int i=5000; i<10000; i++) 
      mp->insert(pair<int, int>(i, i+2000)); 
     return NULL; 
    } 


    int main() 
    { 
     typedef map<int, int> IntMapType; 

     IntMapType mp; 
     PrintMp MpPrintObj; 
     int rc; 

     pthread_t th1, th2; 
    //thread 1 creation 
     rc = pthread_create(&th1, NULL, ins_th1, static_cast<void*>(&mp)); 
     if (rc != 0) 
     { 
      cerr<<strerror(rc)<<"in thread1"<<endl; 
      exit(EXIT_FAILURE); 
     } 
    //thread 2 creation 
     rc = pthread_create(&th2, NULL, ins_th2, static_cast<void*>(&mp)); 
     if(rc!=0) 
     { 
      cerr<<strerror(rc)<<"in thread2"<<endl; 
      exit(EXIT_FAILURE); 
     } 
    //lets wait for the thread to finish 
     rc = pthread_join(th1, NULL); 
     if (rc != 0) 
     { 
      cerr<<strerror(rc)<<"join failure for thread1"<<endl; 
      exit(EXIT_FAILURE); 
     } 

     rc = pthread_join(th2, NULL); 
     if (rc != 0) 
     { 
      cerr<<strerror(rc)<<"join failure for thread2"<<endl; 
      exit(EXIT_FAILURE); 
     } 

     cout<<"Map data"<<endl; 
    //now print it 
     for_each(mp.begin(), mp.end(), MpPrintObj); 
     cout<<endl; 

     return 0; 
    } 

但它不工作。任何人都可以給我一些建議嗎?

+5

你是什麼意思,它不起作用?怎麼了? – anio 2012-07-20 19:46:08

+0

它沒有工作,或者它是工作,你沒有想到它會工作? – Chad 2012-07-20 19:55:50

+0

我預料它不會顯示正確的輸出,因爲stl map不是線程安全的。但它顯示一切正確。 – 2012-07-20 20:04:59

回答

1

您只測試插入,這可能或可能不會以線程安全的方式實現,只爲您所知。但是,你的測試並不完整。允許線程將相同的密鑰寫入map,並且您可能會遇到沒有多個線程時不會發生的錯誤。

// ins_th1 
    for(int i =0 ; i<10000; i++) 
     mp->insert(pair<int,int>(i, i+1000)); 

    // ins_th2 
    for(int i=0; i<10000; i++) 
     mp->insert(pair<int, int>(i, i+2000)); 

您還應該測試從map刪除。當我修改程序來填充map時,在啓動線程之前,只有線程從map中刪除了某些內容,程序纔會被鎖住。

// ins_th1 
    for(int i =0 ; i<5000; i++) 
     mp->erase(i); 

    // ins_th2 
    for(int i=5000; i<10000; i++) 
     mp->erase(i); 

    // near top of main 
    for(int i =0 ; i<5000; i++) 
     mp.insert(pair<int,int>(i, i+1000)); 
    for(int i=5000; i<10000; i++) 
     mp.insert(pair<int, int>(i, i+2000)); 
    //... launch threads 
0

我試圖按照你所說的來實施。

儘管沒有使用任何同步機制,我得到了完美的結果。