1

未処理の例外とアクセス違反の読み取り場所エラーが発生しています。しかし、完全に実行されている場合もあります。ベクトルとベクトル反復子を適切に渡していますか? エラーの考えられる原因は何ですか。

struct DataStructure
{
    MapSmoother *m1;
    std::vector<Vertex *> v1;
    std::vector<Vertex *>::iterator vit_f;
    std::vector<Vertex *>::iterator vit_e;
    DataStructure() {
        m1 = NULL;
        v1;
        vit_f;
        vit_e;
    }
};
DWORD WINAPI thread_fun(void* p)
{
        DataStructure *input = (DataStructure*)p;
        while ( input->vit_f != input->vit_e ) {
            Vertex *v = *((input->vit_f)++);
            (*(input->m1)).relax(v);
        }
        return 0;
}
int main()
{
    //Read and encode color to Mesh
    // msmoother is an object
    DataStructure* input = new DataStructure();
    input->m1 = &msmoother;
    for(int i = 0; i < 7; ++i) {
        for(int color = 1; color <= k; color++) {
            std::vector<Vertex *> verList;
          //all the vertices with the same color index will be stored in verList vector
            input->v1 = verList;    //Copied to structure
            std::vector<Vertex *>::iterator vit1 = verList.begin();
            std::vector<Vertex *>::iterator vit2 = verList.end();
            input->vit_f = vit1;
            input->vit_e = vit2;
            HANDLE hThread[50];
            cout << "     Processing for color: " << color << endl;
            for(int j = 0; j < 50; ++j){
                hThread[j] = CreateThread(0,0,(LPTHREAD_START_ROUTINE)&thread_fun,input,0,NULL);
            }
            WaitForMultipleObjects(THREAD_COUNT,hThread,TRUE,INFINITE);
            //clear verList vector
            //Close Handles to all threads
        }
    }
}

エラーのスクリーンショット

4

2 に答える 2

2

私はC++の初心者なので、間違っているかもしれませんが、問題はここにあると思います。

std::vector<Vertex *>::iterator vit1 = verList.begin();
std::vector<Vertex *>::iterator vit2 = verList.end();
input->vit_f = vit1;
input->vit_e = vit2;

verListにコピーされたベクトルではなく、にイテレータを渡しますDataStructure。ここで欲しいのは:

input->v1 = verList; // copy to structure
input->vit_f = input->v1.begin();
input->vit_e = input->v1.end();
于 2013-02-05T01:19:50.187 に答える
2

いいえ、正しく渡されていません。

このコード:

input->v1 = verList;    //Copied to structure

ベクトルのコピーを作成します。これは、その外観によって意図的に作成されたものです。ベクトルには実際のデータへの単なるポインターが含まれているため、一連のポインターのコピーを作成しているだけです。ただし、フォローアップコード:

std::vector<Vertex *>::iterator vit1 = verList.begin();
std::vector<Vertex *>::iterator vit2 = verList.end();
input->vit_f = vit1;
input->vit_e = vit2;

問題が発生する場所です。オブジェクトに設定しているイテレータinputは、実際にはローカルからのものverListです。あなたのリストからではありません。input->v1

試す:

input->vit_f = input->v1.begin();
input->vit_e = input->v1.end();

補遺

競合状態と不要なベクトルコピーを回避するためにOP用に更新されました。

まず、次のように再定義DataStructureします。

struct DataStructure
{
    MapSmoother *m1;
    std::vector<Vertex *>::iterator first, last
    DataStructure() : m1(NULL) {}
};

次に、スレッド関数を次のように定義します。

DWORD WINAPI thread_fun(void* p)
{
    DataStructure *input = static_cast<DataStructure*>(p);
    if (input && input->m1)
    {
        for (std::vector<Vertex *>::iterator it = input->first
             it != input->last; ++it) 
        {
             input->m1->relax(*it);
        }
    }
    delete input;
    return 0;
}

そして最後に、これを次のように呼び出します:(ループ内)

// all the vertices with the same color index will be stored in verList vector
std::vector<Vertex *> verList;
// ... store vector data ...

cout << "     Processing for color: " << color << endl;
HANDLE hThread[50] = {NULL};
for(int j = 0; j < _countof(hThread); ++j)
{
    DataStructure *input= new DataStructure;
    input->first = verList.begin();
    input->last = verList.end();
    input->m1 = &msmoother
    hThread[j] = CreateThread(0,0,(LPTHREAD_START_ROUTINE)&thread_fun,input,0,NULL);
}
WaitForMultipleObjects(THREAD_COUNT,hThread,TRUE,INFINITE);

またはそのようなもの。私はこれをオンラインで槌で打ったので、それがコンパイルされるかどうかさえわかりませんが、うまくいけば、あなたにまともな十分なアイデアを与えるはずです。すべてのスレッドは、独自のイテレータのペアをverList配列に取り込み、そのため、同時アクセスを行います。注:ベクトルを変更することはできません。それだけを使用してください。イテレータを取得する構造は、作成者スレッドによって割り当てられますが、スレッド自体が所有し、最終的にはスレッド自体を破棄します。

于 2013-02-05T01:20:41.723 に答える