看板 C_and_CPP 關於我們 聯絡資訊
遇到的問題: (題意請描述清楚) 我使用OpenMP加上STL Container做了一個簡單的程式 (不要特別在意程式在做什麼,這只是練習^^") 主要測試使用OpenMP插入資料到STL Container裡面 程式碼有看到一個註解的地方 如果把註解取消,程式會發生Segmentation fault (程式碼一,把註解拿掉就會錯) 我另外一個測驗比較簡單 (程式碼二) 他一樣是隨機插入資料到Map卻不會有錯(平行化插入) 希望得到的正確結果: 正確跑完 程式跑出來的錯誤結果: Segmentation Fault 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) g++ 4.1.2 Linux 2.6 編譯指令 g++ -fopenmp xxx.cpp ./a.out 有問題的code: (請善用置底文標色功能) (置底的上色連結好像失效了@@?) #include <iostream> #include <map> #include <ctime> using namespace std; int main() { srand( time( NULL ) ); multimap<int, int> test; multimap<int, int>::iterator it; int minNum; int i; int count = 0; test.insert(make_pair( 0, 0 ) ); do { it = test.begin(); minNum = it->first; //#pragma omp parallel for( i = 0 ; i < 5 ; ++i ) { if( rand() > minNum ) test.insert( make_pair( rand() , rand() ) ); } test.erase( it ); count++; } while( test.size() > 0 && count < 1000 ); return 0; } 程式碼二 前後不打了,因為跟上面雷同 只要把do...while那一段刪掉換成下面的 #pragma omp parallel for( i = 0 ; i < 10000 ; ++i ) { test.insert( make_pair( rand(), rand() ) ); } 補充說明: 平行插入資料應該是沒問題 只是我不瞭解為什麼第一段程式碼無法執行(會發生記憶體錯誤) 請高手解惑~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.145.170
wangm4a1:STL container 並沒有保證 thread safe 01/26 17:00
tinlans:GCC 在 STL 的 generic algo 是有做類似的東西,但是跟你 01/26 20:42
tinlans:想的有一點差距:http://tinyurl.com/yj59rdn 01/26 20:42