作者DRLai (蘇打)
看板C_and_CPP
標題[問題] OpenMP + STL container會產生錯誤
時間Mon Jan 25 22:50:01 2010
遇到的問題: (題意請描述清楚)
我使用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